我的问题是如何在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;
最佳答案
由于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?)。