我正在尝试将原生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对象列表。
谢谢!
答案 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
如果修改实体以从另一个实体继承是不合适的,则可以为此查询创建特殊的实体(具有继承性),因为可以为同一个表创建多个实体。但你可能没有找到合理的努力。