【发布时间】:2012-03-17 16:06:22
【问题描述】:
当使用 DTO 对象时,我遇到了休眠问题,它正在执行 N+1 SELECTS。
例如,这个 JPQL 查询:
SELECT com.acme.MyDto(t) FROM Thing t
MyDto 的构造函数类似于:
public MyDto(Thing t) {
...
}
这会导致如下查询:
SELECT t.id FROM thing t WHERE condition
接下来是每一行的所有单个查询,即:
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 1
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 2
SELECT t.id, t.column1, t.column2 FROM thing t WHERE t.id = 3
...
但是,如果构造函数不接受实体,而是接受每个单独的列,那么 hibernate 的行为就像您所期望的那样,即:
public MyDto(Integer id, String column1, String column2) {
...
}
那么生成的SQL是这样的:
SELECT t.id, t.column1, t.column2 FROM thing t WHERE condition
除了创建接受每一列的 DTO 构造函数之外,有没有办法让 hibernate 从一开始就一次选择所有列?
我们正在使用的表有 100 多列分布在可嵌入对象中,因此维护一个庞大的构造函数非常烦人。该表已高度规范化并且没有连接。
【问题讨论】: