【问题标题】:How to use UNION ALL in JPA?如何在 JPA 中使用 UNION ALL?
【发布时间】:2017-03-17 14:55:41
【问题描述】:

我的问题是我如何在 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 中没有这样的东西。
  • 那么在 jpa 中有没有办法做到这一点?
  • JPA 允许您使用 SQL 查询,然后您抛弃了数据库独立性。
  • HQL 可以吗?
  • 不知道。 JPA 不做“HQL”

标签: java sql hibernate jpa


【解决方案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?)。

【讨论】:

    【解决方案2】:

    分别使用每个查询。喜欢

    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'
    

    然后您可以分别传递每个查询,然后您可以将这些结果合并为一个结果。

    【讨论】:

    • 如果在这些存储库之上有分页实现会很忙。
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2021-05-07
    • 2020-09-20
    相关资源
    最近更新 更多