SELECT NEW()在构造函数中使用多对一集合--HQL

时间:2010-12-15 08:28:16

标签: hibernate constructor hql

我似乎没有找到我拒绝接受的“不可能”的答案:)

这是我的HQL查询:“SELECT new TestTable(t.id,t.param1,t.param2,t.param3,stps)FROM TestTable t left join t.steps as stps WHERE t.someObj.id IN( :someObjIds)“

TestTable具有以下consturtor:public TestTable(Integer param1,Integer param2,Date param3,Date param4,Set steps)

我试图在构造函数中使用Collection而不是Set但是它不起作用,构造函数将只接收集合中的第一个项目作为参数而不是我预期的整个集合。

在查询中我也尝试使用左连接提取t.steps,尝试没有左连接,试图用“元素”包围构造函数中的“stps”参数,如下所示:elements(stps)

但没有任何效果......我这样做的原因是因为TestTable非常大并且有很多列和关联,但在这种情况下我只想要4列和一个集合。当一个查询最多可以返回400,000个对象时,这就变得不必要了。

任何人的想法??? (顺便说一句,我的名字是Tomer)

2 个答案:

答案 0 :(得分:4)

您的查询可以在没有“新”构造函数的情况下工作,但它不能满足您的期望。

此查询返回t.id,t.param1,t.param2,t.param3,[步骤表中的一个实体] 在每一行上,由于左连接到步骤表,重复您的结果。

我的建议是,首先创建一个从TestTable获取数据的查询。 像

这样的东西
List<TestTable> resultList = "select new TestTable(t.id,t.param1,t.param2,t.param3) from TestTable where
                      t.someObj.id in (:someObjId)"

然后,创建从每个TestTable的步骤表中获取数据的查询。

for (TestTable tt : resultList) {
    List<Steps> stepList = "select st from Steps st where st.testTable.id = :ttId";
    tt.setSteps(stepList);
}

答案 1 :(得分:4)

您不能在构造函数表达式中使用集合值路径表达式。关注answer