我在使用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]
任何帮助都将不胜感激。
答案 0 :(得分:2)
您不能在SELECT中使用集合值属性(在JPA规范术语中:collection_valued_path_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