Java 具有多个关系的TypedQuery

Java 具有多个关系的TypedQuery,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,我在使用TypedQuery接口、NamedQuery和多对多关系创建查询时遇到问题。 这是我的报告实体: @Entity @Table(name = "REPORT") @NamedQueries({ @NamedQuery(name = Report.NAMED_QUERY.FIND_USERS, query = "SELECT r.users FROM Report r WHERE r = :report")}) public class Report { public i

我在使用TypedQuery接口、NamedQuery和多对多关系创建查询时遇到问题。 这是我的报告实体:

@Entity
@Table(name = "REPORT")
@NamedQueries({
    @NamedQuery(name = Report.NAMED_QUERY.FIND_USERS, query = "SELECT r.users FROM Report r WHERE r = :report")})

public class Report {

  public interface NAMED_QUERY {
      String FIND_USERS = "Report.findUsers";
  }

  @ManyToMany
  @JoinTable(name = "REPORT_USER", joinColumns = @JoinColumn(name = "REPORT_ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID"))
  private Set<User> users;

  //another fields, getters and setters
}
我不知道如何使用这个命名查询

public List<User> findUsersRelatedToReport(Report report) {
    TypedQuery<User> query = entityManager.createNamedQuery(Report.NAMED_QUERY.FIND_USERS, User.class)
            .setParameter("report", report);
    return query.getResultList();
}

任何帮助都将不胜感激。

您不能在SELECT中使用集合值属性(在JPA规范术语中:集合值路径表达式)

这就是为什么查询要复杂一点,一种方法是:

SELECT DISTINCT(u)
FROM User u 
WHERE EXISTS (
    SELECT r 
    FROM Report r 
    WHERE r = :report AND u MEMBER OF r.users)

尝试将报表类中用户的数据类型更改为列表

私有列表用户

而不是

private Set<User> users;
私有集用户;

您试图将用户集作为导致错误的select中的一列返回

我认为您可以尝试从用户表中选择数据。试试这样:
从用户u中选择u,其中u.report=:report

这是一个老问题,但我最近也遇到了这个问题,并提出了更优雅的解决方案:的确,在选择表达式中不能使用collection\u valued\u path,但您肯定可以通过此路径进行连接:

SELECT u FROM Report r JOIN r.users u where r = :report
private Set<User> users;
SELECT u FROM Report r JOIN r.users u where r = :report