Я пытаюсь использовать ограничение на поле класса 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. Аналогично относится и к категории. Итак, как это можно сделать? Также, когда я не использую проекцию, указанные выше ограничения работают нормально. Так также в чем причина этого? Заранее спасибо.
http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/ # querycriteria-ассоциации –