具有ManyToMany关系的TypedQuery

时间:2013-03-06 18:06:05

标签: 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 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
}

和用户实体。在这里,我没有映射多对多关系的字段。

@Entity
@Table(name = "USER")
public class User {

  //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();
}

最后我有例外:

Type specified for TypedQuery [package_name.User] is incompatible with query return type [interface java.util.Set]

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您不能在SELECT中使用集合值属性(在JPA规范术语中:collection_valued_pa​​th_expression)。

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

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

答案 1 :(得分:0)

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

private List<User> users;

而不是

private Set<User> users;

答案 2 :(得分:0)

您正在尝试将一组用户作为选择中导致错误的列返回。

我认为你可以尝试从User表中选择数据。尝试类似的东西: SELECT u FROM User u WHERE u.report = :report