2012-08-02 74 views
0

嗨,我有一個簡單的產品Pojo與休眠註釋。具體的我想獲得/返回的屬性,並返回一個字段中的一對多關係?

Class Product 
Product ID 
name 
title 
make 
colors (1..*) lazy 

我可以知道有沒有辦法在單行文本中獲取productID,名稱和顏色?

例如:

name: "Monitor" 
colors: "Green; Red; Blue;" 

原因:用戶需要5000上市的上市,它只是需要名稱,並列出顏色在一個領域。

休眠需要1個查詢(前5000個)+ 5000個查詢(顏色)來獲取數據。我希望只在1個查詢中得到它。

使用:Hibernate的標準

加上:我已經設置criteria.maxResult(5000),當我使用FetchMOdel.JOIN用(Criteria.DISTINCT_ROOT_ENTITY);它爲我提供了小於5000個完整的結果,這是因爲每一個「色」迴歸成一排..

回答

2

執行以下查詢,以連接抓取從而將加載顏色的產品:

select distinct product from Product product 
left join fetch product.colors color 
where ... 

HQL在Hibernate documentation充分描述:

A「取」加入允許值的關聯或集合是 使用單個選擇它們的父對象一起初始化。 這在集合的情況下特別有用。它 有效地覆蓋了關聯和集合的映射文件的外連接和惰性聲明 。

與標準做起來類似(只是比較繁瑣:做到這一點只有在where子句真的是動態的):

Criteria c = session.createCriteria(Product.class, "product"); 
c.setFetchMode("product.colors", FetchMode.JOIN); 
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
c.add(...); 

而這裏的the documentation相關部分:

您可以在運行時使用指定關聯提取語義 setFetchMode()

你已經在這裏問了很多Hibernate的問題。你爲什麼不閱讀文檔?

編輯:

從意見,看來,你知道該怎麼做你想要什麼,但你有申請結果的最大數量的問題。

解決此問題的最簡單方法是執行第一個查詢,限制爲5000,僅加載產品的ID。然後執行第二查詢,而不是限制,裝載產品,它們的顏色,具有在由第一查詢檢索到的組ID的ID:

select product.id from Product product where ... 

select distinct product from Product product 
left join fetch product.colors color 
where product.id in (:productIds) 

要注意的是某些數據庫(甲骨文,例如)限制您可以將其放入IN子句中的元素數(使用Oracle時最多爲1000個元素)。因此,您可能必須將5000個ID的集合劃分爲1000個元素的集合,然後對每個此分區執行查詢。

+0

我忘記了我需要它使用休眠條件 – seesee 2012-08-02 14:26:06

+0

請參閱我編輯的答案。並閱讀文檔。這就是你學習的方式。 – 2012-08-02 14:31:31

+0

其實我以前使用FetchMode.JOIN,但用戶想要5000條記錄返回..但是我得到的記錄少於5000條,因爲我已經設置了「變換」結果..這隻會讓事情變得更糟。 – seesee 2012-08-02 14:34:06

0

什麼是您的數據庫? 您可以在用「@Formula('...')」註釋標註的實體中定義一個colorsText。但是你應該寫一個查詢,爲每一行返回一個字符串。

在大多數數據庫中都有某種concatenate聚合函數,只是找到你的數據庫的函數。

+0

Oracle DB,但它會更快嗎? – seesee 2012-08-02 14:35:13

相關問題