ユーザーは多くの役割を果たすことができます。パラメータ リストから少なくとも 1 つのロールを持つすべてのユーザーを取得したいと考えています。
データ定義は次のようになります。
@Entity
public class User implements Serializable {
@Id
@Column(name = "Id",
nullable = false)
private long id;
@Column(name = "LoginName",
length = 30,
unique = true,
nullable = false)
private String loginName;
@ElementCollection
@Enumerated(EnumType.STRING)
@CollectionTable(name = "Role",
joinColumns = @JoinColumn(name = "Id"),
uniqueConstraints = @UniqueConstraint(columnNames = {"Id", "Role"}))
@Column(name = "Role")
private Set<RoleType> roles = new HashSet<RoleType>();
}
public enum RoleType {
GUEST,
ACCOUNTING,
ADMIN,
OPERATOR;
}
ここで、パラメーター リストから少なくとも 1 つのロールを持つすべてのユーザーが必要です。リストは動的である場合があります。次のコードを試しました:
String sql = "SELECT DISTINCT u FROM User u JOIN u.roles AS r WHERE r IN :filteredRoles";
Query query = entityManager.createQuery(sql);
List<RoleType> filteredRoles = new ArrayList<RoleType>();
filteredRoles.add(RoleType.ADMIN);
filteredRoles.add(RoleType.ACCOUNTING);
query.setParameter("filteredRoles", filteredRoles);
List<User> result = (List<User>) query.getResultList();
次の例外を受け取ります。
Exception [EclipseLink-6078] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.QueryException
Exception Description: The class of the argument for the object comparison is incorrect.
Expression: [null]
Mapping: [org.eclipse.persistence.mappings.DirectCollectionMapping[roles]]
Argument: [[ADMIN, ACCOUNTING]]
Query: ReadAllQuery(referenceClass=User sql="SELECT DISTINCT t0.Id FROM User t0, Role t1 WHERE ((t1.Role IN ?) AND (t1.Id = t0.Id))")
JPQL のいくつかのバリエーションを試しましたが、成功しませんでした。役立つヒントが得られることを願っています。