2013-03-06 93 views
0

我有一个问题,用TypedQuery接口,NamedQuery和多对多关系创建查询。 这里是我的报告实体:TypeToQuery与ManyToMany的关系

@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] 

任何帮助,将不胜感激。

回答

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) 
+0

谢谢!这对我来说很有效 – Bujaka 2013-03-07 09:52:28

0

尝试在你的报告类列表更改用户的数据类型。

private List<User> users;

代替

private Set<User> users; 
0

你试图返回一组用户在您选择的列导致错误。

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

0

这是一个老问题,但我也打这个最近和更优雅的解决方案提出了:这是真的,你不能选择表达式中使用collection_valued_pa​​th,但你绝对可以做到连接在这路径:

SELECT u FROM Report r JOIN r.users u where r = :report