我的问题是我如何在JPA中执行UNION ALL子句? 可以使用@NamedQuery吗?此查询在每个SELECT语句中一次使用2个表,最后使用ORDER BY
SELECT 0 as intorder, u.id, q.order_type
FROM test_union u, test_query q
WHERE u.id = q.id
AND u.type is NULL
AND q.field1 = 'DEFAULTS'
UNION ALL
SELECT 1 as intorder, u.id, q.order_type
FROM test_union u, test_query q
WHERE u.id = q.id
AND u.type is NOT NULL
AND q.field1 = 'TESTING'
UNION ALL
SELECT 2 as intorder, u.id, q.order_type
FROM test_union u, test_query q
WHERE u.id = q.id
AND u.type is NULL
AND q.field1 = 'DEFAULTS'
ORDER BY intorder, q.order_type;
答案 0 :(得分:1)
由于Jpql和Hql(一个是另一个的子集,JPA使用Jpql)不支持 UNION ,因此您需要使用适合您的数据库查询语言的本机查询。实现可能如下所示:
@Entity
@NamedNativeQuery(
name="EntityClassName.functionName"
, query="SELECT .. "
+ "UNION ALL "
+ "SELECT .."
, resultClass=YourResultClass.class`
)
直接在您的一个实体和您的存储库界面中:
public interface EntityClassNameRepository extends JpaRepository<EntityClassName, Long> {
@Query(nativeQuery = true)
List<YourResultClass> functionName(parameter list)
当我做同样的事情YourResultClass
需要成为一个实体时。
另一个解决方案是将UNION从数据库中提取到JVM中,其中多个查询结果会增强列表。之后,列表也可以进行排序(How to sort a ArrayList in Java?)。
答案 1 :(得分:0)
单独使用每个查询。喜欢
SELECT 0 as intorder, u.id, q.order_type
FROM test_union u, test_query q
WHERE u.id = q.id
AND u.type is NULL
AND q.field1 = 'DEFAULTS'
然后您可以单独传递每个查询,然后您可以将这些结果合并到一个结果中。