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) を使用することはできません。

そのため、クエリはもう少し複雑です。1 つの方法は次のとおりです。

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

エラーの原因となっている選択の列として一連のユーザーを返そうとしています。

User テーブルからデータを選択できると思います。そのようなことを試してください: SELECT u FROM User u WHERE u.report = :report

于 2013-03-08T20:29:24.793 に答える