假设我有一个表,其中包含用户和类型的所有帐户。 我想制作一个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一起使用?预先谢谢你!
答案 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");
或者如果您已映射实体:
Pair<K,V>
创建Pair(K key, V value)
类或从任何external library中使用它基于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();
将存储库结果转换为服务中的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