我正在寻找优化休眠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