我正在编写一个Dao以获取与某个人相关的所有消息.但是我找不到正确的JPQL语法.
在我的模型中:
>一个人有多个角色(我将这些角色作为参数传递给查询:一组枚举值).
>一条消息与多个角色有关.
因此,我想查找与某人相关的所有消息:
SELECT m FROM Message m
WHERE m.roles [contains one of] :userRoles
给予:userRoles作为Set< Role>参数.
该缺失的[包含]部分之一的正确语法是什么?
我看过IN和MEMBER OF
例如
SELECT m FROM MESSAGE m
WHERE m.roles IN :userRoles
但是这两个关键字在一侧都需要一个项目.双方都有多个物品.
更多详情:
@Entity
@Table(name = "message")
public class Message {
@Id
private Long id;
@ElementCollection
@Enumerated(javax.persistence.EnumType.STRING)
@JoinTable(name="message_roles",
joinColumns={@javax.persistence.JoinColumn(name="message_id")})
@Column(name="role_code")
private Set<Role> roles;
...
}
public enum Role {
DEVELOPER, ADMIN, TESTER, MANAGER
}
这将产生一个看起来正确的表结构:
message
message_id
message_roles
message_id
role_code
但是我不知道如何查询它是否包含给定角色的特定列表之一.
我是否必须重写它以单独传递每个用户角色?
出于特定于应用程序的原因,我无法随处加入以获取其角色:角色必须是查询的参数.
解决方法:
试试这个:
SELECT DISTINCT m FROM MESSAGE m JOIN m.roles r WHERE r IN :userRoles