在我的实体中,我有这个字段
@ElementCollection
@CollectionTable
@MapKeyColumn(name = "SERVER_ID")
@Column(name = "IS_SYNC")
private Map<String, Boolean> serverSyncs = new HashMap<>();
我试图让我的桌子中没有条目的所有实体等于&#34; serverId&#34; (在我的函数中作为参数传递)或者有一个条目,但值为false。
这就是我现在所做的
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = builder.createQuery(clazz);
Root<T> root = criteriaQuery.from(clazz);
MapJoin<T, String, Boolean> mapRoot = root.joinMap("serverSyncs");
List<T> result = session.createQuery(
criteriaQuery.where(
builder.or(
mapRoot.isNull(),
builder.not(mapRoot.key().in(serverId)),
builder.and(
mapRoot.key().in(serverId),
mapRoot.value().in(false)
)
)
)
).list();
问题是我的查询出现了这个错误
无法找到角色的CollectionPersister:ca.tecsar.core.model.AbstractServerEntity.serverSyncs
问题是:如何通过JPA 2.0标准实现我想要的目标?
我需要检索的内容
ID | SERVER_ID | IS_SYNC
1个| 0000000001 |真
1 | 0000000002 |虚假
2 | 0000000003 |假
如果我要求SERVER_ID = 3,我应该得到实体1和2
如果我要求SERVER_ID = 2,我应该得到实体1
如果我要求SERVER_ID = 1,我什么都没得到
答案 0 :(得分:0)
所以我无法用JPA 2 Criteria做到这一点,但我已成功使用SQL Query。我有一个名为PUNCH的表,地图表是PUNCH_SERVERSYNCS。
SELECT p.PUNCHID
FROM PUNCH p
LEFT JOIN PUNCH_SERVERSYNCS pss
ON p.PUNCHID = pss.PUNCH_PUNCHID
WHERE (pss.IS_SYNC = false AND pss.SERVER_ID = 'Server2')
OR NOT EXISTS (SELECT p.PUNCHID FROM PUNCH_SERVERSYNCS pss2 WHERE
pss2.PUNCH_PUNCHID = p.PUNCHID AND pss2.SERVER_ID = 'Server2')
GROUP BY p.PUNCHID