2015-11-01 48 views
2

這一個讓我難住。我有一個想法如何標準的工作,但由於某種原因,這個查詢給我的問題無法找到一個屬性,當它明確存在。Hibernate標準無法解決屬性時,它存在

Shelf.java

@Entity 
@Table(name="BOOKSHELF") 
public class Shelf { 

@Id 
private int shelfId; 
private String shelfName; 
private String shelfType; 
@OneToMany(mappedBy="shelf",cascade=CascadeType.ALL) 
private Set<Book> book = new HashSet<Book>(0); 

//getters&setters here 

Book.java

@Entity 
@Table(name="BOOKS") 
public class Book { 

@Id 
private int bookId; 
private String bookName; 
private String bookState; 
@ManyToOne(cascade=CascadeType.ALL) 
private Shelf shelf;  

//getters&setters here 

這裏是我的條件查詢:

Criteria criteria = session.createCriteria(Book.class) 
        .add(Restrictions.eq("shelf.shelfId", bookLocId)) 
        .add(Restrictions.ne("shelf.shelfType", "table")) 
        .add(Restrictions.ne("bookState", "requested"); 

的問題是中間限制。它找不到shelfType,但它發現shelfId就好。感謝您的任何幫助!

回答

3

它發現shelfId就好,因爲它是關聯的關鍵,因此查詢不需要連接來查看ID。如果你想限制其他財產,你必須加入shelf協會,例如像這樣:

Criteria criteria = session.createCriteria(Book.class) 
     // JOINs shelf association and creates alias 'shelf' for it 
     .createAlias("shelf", "shelf") 
     .add(Restrictions.eq("shelf.shelfId", bookLocId)) 
     .add(Restrictions.ne("shelf.shelfType", "table")) 
     .add(Restrictions.ne("bookState", "requested"); 
+0

謝謝博胡斯拉夫!這很好。我確實研究過'.createAlias',但也許我第一次沒有正確使用它。再次感謝。現在更清楚了。 – SS113

相關問題