与JPA CriteriaBuilder一起使用All All和Sum

时间:2012-02-01 23:29:35

标签: jpa sum union criteria-api

我正在尝试将原生SQL查询转换为使用JPA 2.0中的Criteria API。我在Google上发现了很多Criteria API示例,但我很难将所有部分放在一起。我希望有经验的人能够帮助我。本机查询如下所示:

select 
    sum(amount) from firstTable, secondTable 
        where firstTable.id = secondTable.id 
            and amount <> 0 
            and firstTable.id = ?
union all
select 
    sum(amount) from firstTable, thirdTable 
        where firstTable.id = thirdTable.id 
            and amount <> 0 
            and firstTable.id = ?

原始查询结果集返回一个BigDecimal对象列表。

谢谢!

4 个答案:

答案 0 :(得分:10)

JPA不支持UNION,要么使用本机SQL查询,要么执行两个查询。

答案 1 :(得分:3)

抱歉,以下示例不是联合,而是联接。

我会考虑使用具有多个根的查询。

这是Hiberante开发者指南的一个例外,该代码与JPA 2.0兼容。

条件查询可以定义多个根,其效果是在新添加的根和其他根之间创建笛卡尔积。以下是匹配所有单身男性和所有单身女性的示例:

CriteriaQuery query = builder.createQuery();
Root<Person> men = query.from( Person.class );
Root<Person> women = query.from( Person.class );
Predicate menRestriction = builder.and(
        builder.equal( men.get( Person_.gender ), Gender.MALE ),
        builder.equal( men.get( Person_.relationshipStatus ), RelationshipStatus.SINGLE )
);
Predicate womenRestriction = builder.and(
        builder.equal( women.get( Person_.gender ), Gender.FEMALE ),
        builder.equal( women.get( Person_.relationshipStatus ), RelationshipStatus.SINGLE )
);
query.where( builder.and( menRestriction, womenRestriction ) )

答案 2 :(得分:1)

如果你需要Union All,那么我认为有两个实体可以将继承应用于它们。

答案 3 :(得分:0)

正如Marcin所说,至少在特殊情况下,继承是可能的。

如果您可以使用TABLE_PER_CLASS继承策略使查询的实体从另一个继承,可以在hibernate中提供,但在那里有限制 - 您不能使用IDENTITY和AUTO)并且如果查询中存在的字段具有相同的然后,您可以通过查询父实体来统一这两个实体。

例如,如果实体类Child从具有字段“name”的实体类Parent扩展,则查询将为:

从父p

中选择p.name

要仅选择父实体的名称,请使用TYPE添加条件。

从父p中选择p.name,其中TYPE(p)= Parent

如果修改实体以从另一个实体继承是不合适的,则可以为此查询创建特殊的实体(具有继承性),因为可以为同一个表创建多个实体。但你可能没有找到合理的努力。

相关问题