我正在尋找優化休眠select
查詢的最佳方式。休眠選擇查詢優化
這裏是一個基本的例子:
BDD模型 1個客戶端 - >ñ合同 - > N個選項
到請求客戶機 「XXXX」 的所有數據的最簡單的方式是這樣的:
final Query hqlQuery = jdbcTemplate.createHQLQuery("from Client cli left join fetch cli.contracts con left join fetch con.options where cli.id=:idClient");
hqlQuery .setString("idClient", "xxxx");
Client client = (Client) hqlQuery.uniqueResult();
有時這是不可能的,因爲有兩個數據要返回。
所以,我分裂的要求,somethink像:
// Query 1
final Query hqlQueryClient = jdbcTemplate.createHQLQuery("from Client cli left join fetch cli.contracts where cli.id=:clientId");
hqlQueryClient.setString("clientId", "xxxx");
Client client = (Client) hqlQueryClient.uniqueResult();
List<String> listContractIds = new ArrayList<String>();
for (Contract contract : client.getContracts()) {
listContractIds.add(contract.getId());
}
// Query 2
final Query hqlQueryOptions = jdbcTemplate.createHQLQuery("from Option opt where opt.contract.id in(:contractIds)");
hqlQueryOptions.setParameterList("contractIds", listContractIds);
List<Option> options = hqlQueryClient.list();
但是,與第二種方式,我不能在client
對象「注入」 options
,所以我必須處理client
和options
對象在我的代碼中,並在options
列表中查找與我正在使用的合同對應的那些列表。
有沒有辦法用第二次請求的值來完成Hibernate對象(在我的例子中是客戶端)?
感謝您的幫助。
PS:請問如果現在還不清楚,我是法國人:)
沒有辦法直接在主對象中注入3個查詢的結果(而不是處理Map)? – pierrefevrier
如果您只從選項 - >合同 - >客戶端導航,則您可能對第一個查詢正常。如果按照其他方式(客戶端 - >合同 - >選項),您將按[n + 1選擇](http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue)問題 –
你說得對,但我無法從我的代碼中的Option - > Contract - > Client中導航,我正在以另一種方式(客戶端 - >合同 - >選項)進行導航。爲了避免n + 1選擇問題,我從來不會調用'contrat.getOptions()'。相反,我過濾結果的選項查詢以編程方式(通過contrat id),但它不像只調用'contrat.getOptions()',這是這篇文章的主題:我怎麼能做得更好:) – pierrefevrier