繁体   English   中英

带有SELECT子句中的子查询的JPQL /休眠查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM