0

我在使用 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]

任何帮助,将不胜感激。

4

4 回答 4

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)
于 2013-03-06T18:56:51.313 回答
0

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

private List<User> users;

代替

private Set<User> users;
于 2013-03-06T18:59:32.430 回答
0

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

我认为您可以尝试从用户表中选择数据。尝试这样的事情: SELECT u FROM User u WHERE u.report = :report

于 2013-03-08T20:29:24.793 回答
0

这是一个老问题,但我最近也遇到了这个问题并提出了更优雅的解决方案:确实你不能在 select 表达式中使用 collection_valued_pa​​th ,但你绝对可以在这条路径上进行连接:

SELECT u FROM Report r JOIN r.users u where r = :report
于 2015-09-19T20:08:14.967 回答