![](/img/trans.png)
[英]Cannot writing JPQL query with subquery in FROM clause - Spring Data Jpa - Hibernate
[英]JPQL/Hibernate query with Subquery in SELECT clause
我有一组JPA实体类,如下所示(简化):
@Entity(name="region")
public class Region {
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
protected Long id;
}
@Entity(name="user")
public class User {
@OneToMany(fetch = FetchType.EAGER)
@JoinTable
(
name="user_region",
joinColumns={ @JoinColumn(name="user_id", referencedColumnName="id") },
inverseJoinColumns={ @JoinColumn(name="region_id", referencedColumnName="id", unique=true) }
)
protected Set<Region> regions;
}
每个用户可以通过user_region表与0个或更多区域相关联。
使用JPQL,我试图创建一个查询,该查询将为我提供Object []列表,其中第一项是区域,第二项是分配给该区域的用户数。
在单个区域中执行此操作很容易:
"select count(u) from " + User.class.getName() + " u " +
"where :region member of u.regions"
这很好。
但是我希望不必为每个区域的调用而烦恼数据库,因此希望将它们放在一起。 我努力了:
"select r, (" +
" select count(u) from " + User.class.getName() + " u " +
" where r member of u.regions " +
") from " + Region.class.getName() + " r " +
"where r in :regionList";
但这会导致每个区域的计数为零(这不正确,因为单选择会返回非零结果)。
查看相关问题的答案,似乎SELECT部分中的子选择不起作用,因为它们仅在WHERE和HAVING部分中被允许,但这不会引发任何语法异常,它的计数结果为零,所以我对此不确定。
谁能告诉我如何重新处理查询以在多个区域工作?
结合使用JPA 2.0和Hibernate 4.2
您可以使用以下方法实现此目的:
select r, count(u) from " + User.class.getName() + " u inner join u.regions r where r in :regionList group by r
这对于没有用户的区域可能不起作用,如果不需要用户,则可以使用右联接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.