JPQL构造函数表达式,如何急切地获取主要实体,并选择新的'

时间:2014-05-07 01:00:38

标签: sql hibernate select jpa

我的原始查询有点复杂,但我想要做的是获取实体AlertCondition以及一些其他字段。

    + "  SELECT new org.rhq.core.domain.alert.composite.AlertConditionEventCategoryComposite " //
    + "       ( " //
    + "         ac, " //
    + "         res.id " //
    + "       ) " //
    + "    FROM AlertCondition AS ac FETCH ALL PROPERTIES " //
    + "    JOIN ac.alertDefinition ad " //
    + "    JOIN ad.resource res " //
    + "   WHERE " + AlertCondition.RECOVERY_CONDITIONAL_EXPRESSION //
    + "     AND ( res.agent.id = :agentId OR :agentId IS NULL ) " //
    + "     AND ad.enabled = TRUE " //
    + "     AND ad.deleted = FALSE " //
    + "     AND ac.category = 'EVENT' " //
    + "ORDER BY ac.id"), //

问题是 Hibernate 只选择AlertCondition的ID,所以当访问这个对象时,这最终需要N + 1选择,而我只想做1。

select只是根据debug:

获取ID列
select alertcondi0_.ID as col_0_0_, alertdefin1_.ID as col_1_0_, resource2_.ID as col_2_0_

我想要回来的是* AlertCondition的所有领域。

我无法在 Hibernate 下找到任何方法。 JOIN FETCH在这里也不起作用。

另一种方法是选择表格的每一列,我希望避免这样做。

2 个答案:

答案 0 :(得分:0)

面对同样的问题。 我不知道如何让休眠都无法获取ac.*

但是我找到了解决方法。

@Query("select ac, xxx, zzz")
List<Object[]> fetchRecords()

//
Constructor<?> constructor = AlertConditionEventCategoryComposite.class.getDeclaredConstructors()[0];
List<AlertConditionEventCategoryComposite> composites = fetchRecords.stream().map(constructor::newInstance).collect(Collectors.toList());

答案 1 :(得分:-1)

您可以告诉hibernate使用以下内容获取广告:

JOIN FETCH ac.alertDefinition ad