2014-11-11 6 views
0

Я пытаюсь использовать ограничение на поле класса Book, которое является java.util.Set. Класс книги выглядит следующим образом:Ограничение спящего режима на множестве

@Entity 
public class Book implements java.io.Serializable { 

    /** The Constant serialVersionUID. */ 
    private static final long serialVersionUID = 1L; 

    /** The book id. */ 
    private int bookId; 


    /** The authors. */ 
    private Set<Author> authors = new HashSet<Author>(0); 


    /** 
    * Gets the book id. 
    * 
    * @return the book id 
    */ 
    @Id 
    @GeneratedValue 
    @Column(name = "Book_Id") 
    public int getBookId() { 
     return bookId; 
    } 

    /** 
    * Sets the book id. 
    * 
    * @param bookId 
    *   the new book id 
    */ 
    public void setBookId(int bookId) { 
     this.bookId = bookId; 
    } 




    /** 
    * Gets the authors. 
    * 
    * @return the authors 
    */ 
    @JsonManagedReference 
    @ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "Book_Author", joinColumns = { @JoinColumn(name = "Book_Id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "Author_Id", nullable = false) }) 
    public Set<Author> getAuthors() { 
     return authors; 
    } 

    /** 
    * Sets the authors. 
    * 
    * @param authors 
    *   the new authors 
    */ 
    public void setAuthors(Set<Author> authors) { 
     this.authors = authors; 
    } 



    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + bookId; 
     return result; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     Book other = (Book) obj; 
     if (bookId != other.bookId) { 
      return false; 
     } 
     return true; 
    } 

} 

Я удалил некоторые поля и их Getters and Setters в вышеуказанном классе. В персистентности код для извлечения книги заключается в следующем:

Criteria criteria = session.createCriteria(Book.class) 
        .setProjection(Projections.projectionList() 
          .add(Projections.property("bookId"), "bookId") 
          .add(Projections.property("publisherName"), "publisherName") 
          .add(Projections.property("publishedYear"), "publishedYear") 
          .add(Projections.property("description"), "description") 
          .add(Projections.property("title"), "title") 
          .add(Projections.property("image"), "image") 
          .add(Projections.property("availability"), "availability") 
          .add(Projections.property("authors")) 
          .add(Projections.property("categories")) 
          ).setResultTransformer(Transformers.aliasToBean(Book.class)); 
      criteria.add(
        Restrictions.conjunction().add(
          Restrictions.like("availability", "AVAILABLE"))) 
        .add(Restrictions 
          .disjunction() 
          .add(Restrictions.like("title", bookAttributesLike, MatchMode.ANYWHERE)) 
          .add(Restrictions.like("authors.authorName", 
            bookAttributesLike, MatchMode.ANYWHERE)) 
          .add(Restrictions.like("categories.categoryName", 
            bookAttributesLike, MatchMode.ANYWHERE))); 
      result = criteria.list(); 

Теперь я Авторы является набор и автор класс имеет поле AUTHORNAME, AuthorID. Я хочу ограничить это имя authorName. Аналогично относится и к категории. Итак, как это можно сделать? Также, когда я не использую проекцию, указанные выше ограничения работают нормально. Так также в чем причина этого? Заранее спасибо.

+0

http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/ # querycriteria-ассоциации –

ответ

0

Я не уверен, является ли это причиной вашей проблемы. Однако следует добавить псевдоним к вашим критериям, как:

Criteria criteria = session.createCriteria(Book.class) 
        .createAlias("authors", "authors")... 

Также категории должны быть совмещенным

Смежные вопросы