@Query标记中的嵌套SQL无法正常工作

时间:2019-07-19 16:26:51

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

假设我有一个表,其中包含用户和类型的所有帐户。 我想制作一个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一起使用?预先谢谢你!

2 个答案:

答案 0 :(得分:2)

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

您可以通过不同的方式获得相同的结果:

@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,V>创建Pair(K key, V value)类或从任何external library中使用它
  2. 基于hql查询的存储库方法

    @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<String, Integer>

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

答案 1 :(得分:0)

尝试返回Object[]而不是List<Integer>。我认为返回List<Integer>会表明正在返回Integer值的多行,而您要返回的一行则包含多个Intger列。

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

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

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