【发布时间】:2016-01-23 02:17:25
【问题描述】:
我正在寻找优化 Hibernate select 查询的最佳方法。
这是一个基本的例子:
BDD 模型 1 个客户 -> n 个合同 -> 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();
有时这是不可能的,因为要返回两个大量数据。
所以,我拆分了请求,有点像:
// 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:问不清楚,我是法国人:)
【问题讨论】: