2012-07-09 42 views
2

我有一個關於Hibernate ManyToOne關聯的問題。Hibernate ManyToOne關聯和連接SQL查詢中的表

我有這樣映射一個產品實體:

public class Product { 
@Id 
@DocumentId 
@Column(name = "PRODUCT_ID", columnDefinition = "integer") 
@Index(name = "PRODUCT_ID_IDX") 
private Long id; 

@Column(name = "SALE_PRICE") 
@Index(name = "PRODUCT_PRICE_IDX") 
private Double salePrice; 
... 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "CATEGORY_ID", nullable = true) 
@Index(name = "PRODUCT_ID_CATEGORY_IDX") 
private ProductCategory category; 
} 

所以你怎麼能看到我們有一個產品分類表的關係。我們將FK存儲在產品表中。 當我創建查詢其選擇的具體類別和價格的產品我有一個SQL: select this_.PRODUCT_ID as PRODUCT1_9_1_, this_.BUY_URL as BUY2_9_1_, this_.CATEGORY_ID as CATEGORY15_9_1_, this_.CURRENCY as CURRENCY9_1_, this_.IMAGE_URL as IMAGE4_9_1_, this_.INSTOCK as INSTOCK9_1_, this_.LONG_DESCRIPTION as LONG6_9_1_, this_.NAME as NAME9_1_, this_.RATING as RATING9_1_, this_.RETAIL_PRICE as RETAIL9_9_1_, this_.SALE_PRICE as SALE10_9_1_, this_.SHIPPING as SHIPPING9_1_, this_.SHORT_DESCRIPTION as SHORT12_9_1_, this_.UPC as UPC9_1_, this_.VIEWS as VIEWS9_1_, cat1_.CATEGORY_ID as CATEGORY1_10_0_, cat1_.NAME as NAME10_0_, cat1_.RATING as RATING10_0_, cat1_.VIEWS as VIEWS10_0_, cat1_.VISIBLE as VISIBLE10_0_ from PRODUCT this_ inner join PRODUCT_CATEGORY cat1_ on this_.CATEGORY_ID=cat1_.CATEGORY_ID where ( this_.SALE_PRICE between ? and ? and cat1_.CATEGORY_ID in ( ? ) ) order by this_.NAME asc limit ? offset ?

我的問題是下一步:我如何才能避免內部聯接兩個表:產品和產品分類?

我的標準DAO代碼: criteria.createAlias("category", "cat"); criteria.add(Restrictions.conjunction() .add(Restrictions.between("salePrice", priceLow, priceHigh)) .add(Restrictions.in("cat.id", categoryIds)));

感謝。

回答

2

criteria.createAlias("category", "cat"); 

準確的意思是:創建一個類別實體內連接。

只需使用

criteria.add(
    Restrictions.conjunction() 
     .add(Restrictions.between("salePrice", priceLow, priceHigh)) 
     .add(Restrictions.in("category.id", categoryIds)));