带有映射键和值的 jpa 2 条件

jpa 2 criteria with map key and value

在我的实体中我有这个字段

@ElementCollection
@CollectionTable
@MapKeyColumn(name = "SERVER_ID")
@Column(name = "IS_SYNC")
private Map<String, Boolean> serverSyncs = new HashMap<>();

我正在尝试获取我的 table 的所有实体,这些实体没有键等于 "serverId" 的条目(在我的函数中作为参数传递)或有条目但该值为 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();

问题是我在查询时遇到了这个错误

Could not locate CollectionPersister for role : 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,我应该什么也得不到

所以我不能用 JPA 2 标准来做,但我用 SQL 查询成功了。我有一个名为 PUNCH 的 table,地图 table 是 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