java - JPQL 元素集合 : getting all users which have at least one role of a list

标签 java jpa eclipselink

一个用户可以扮演多种角色。我想从参数列表中获取至少具有一个角色的所有用户。

数据定义如下:

@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;
}

现在我想要所有在参数列表中至少具有一个角色的用户。该列表可以是动态的。我尝试了以下代码:

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 的几种变体,但没有成功。 我希望收到有用的提示。

最佳答案

您可以尝试 2.4 版本吗,这似乎已修复。

关于java - JPQL 元素集合 : getting all users which have at least one role of a list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12554337/

相关文章:

java - 如何在wildfly 10standalone.xml中定义hibernate.c3p0连接池

java - 如何在hibernate实体中初始化复杂类型

java - java中的JSON解析

java - TextTransfer类型解决问题

java - 如何迭代 List<DTO> 并动态获取 DTO 属性值?

java - 是否可以将 JPA 连接池与 Google App Engine 和 Cloud SQL 一起使用?

jpa - 部署后 JPA 实体中的 ClassCastException (Glassfish 3.1.2)

mysql - Map<String,String> 集合表的 ElementCollection 未使用 Map 键作为表键的一部分创建

java - 插入到1 :m relation java spring

java - Android,客户端服务器通信