【问题标题】:Nested SQL in @Query tag is not working properly@Query 标记中的嵌套 SQL 无法正常工作
【发布时间】:2019-11-28 16:18:30
【问题描述】:

假设我有一个包含用户和类型的所有帐户的表。 我想创建一个 Jpa Repository 方法,该方法返回每种类型用户(USER、ADMIN、MASTER)的总数数组。

这是我在 JpaRepository 中的做法:

@Query(value="SELECT   (SELECT COUNT(*) FROM account WHERE account_role='USER'),"
                        + "(SELECT COUNT(*) FROM account WHERE account_role='ADMIN'),"
                        + "(SELECT COUNT(*) FROM account WHERE account_role='MASTER')"
                        + "FROM account LIMIT 1",
            nativeQuery=true)
public List<Integer> getTotalAccountType();

代码执行得很好,但结果不是我所期望的。

结果: [2]

预期结果:[2,10,30]

知道如何将嵌套 SQL 与 JPQL 一起使用吗?提前谢谢!

【问题讨论】:

  • 旁注 - 可能更好的查询:SELECT account_role, COUNT(*) FROM account WHERE account_role IN ('USER', 'ADMIN', 'MASTER') GROUP BY account_role(尽管您需要从您的方法返回不同的类型)

标签: java sql hibernate spring-data-jpa jpql


【解决方案1】:

如果存储库方法返回整数列表,则表示查询结果行包含一个整数值。但是您希望在一行中获得整数序列。

你可以通过不同的方式得到相同的结果:

@Query(value="SELECT COUNT(*) FROM account WHERE account_role=?", nativeQuery=true)
public Integer getTotalAccountType(String role);

然后:

Integer userCount = repository.getTotalAccountType("USER");
Integer adminCount = repository.getTotalAccountType("ADMIN");
Integer masterCount = repository.getTotalAccountType("MASTER");

或者如果你已经映射了实体:

  1. 使用构造函数Pair(K key, V value) 创建Pair&lt;K,V&gt; 类或从任何external library 使用它
  2. 基于hql查询的repository方法

    @Query(value="select new javafx.util.Pair(a.accountRole, count(a)) from Account a group by a.accountRole") public List<Pair<String, Integer>> getRoleCountList();

  3. 将存储库结果转换为服务中的Map&lt;String, Integer&gt;

    javafx.util.Pair<String, Integer> result = repository.getRoleCountList(); Map<String, Integer> map = result.stream().collect(Collectors.toMap(r-> r.getKey(), r-> r.getValue()));

【讨论】:

    【解决方案2】:

    尝试返回 Object[] 而不是 List&lt;Integer&gt;。我认为返回 List&lt;Integer&gt; 将表明正在返回多行 Integer 值,而您将返回包含多个 Intger 列的一行。

    从生成的Object[] 中提取第一个值(表示一行)。这应该是另一个Object[],它将按照返回的顺序返回您的值。

    您也可以删除最后一行 "FROM account LIMIT 1",因为它与结果无关。

    我建议将所有这些都转换为一个对象。如此处所见 - How to return a custom object from a Spring Data JPA GROUP BY query

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多