带有映射键和值的 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
在我的实体中我有这个字段
@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