Java 具有多个关系的TypedQuery
我在使用TypedQuery接口、NamedQuery和多对多关系创建查询时遇到问题。 这是我的报告实体: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
@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