带有地图键和值的jpa 2标准

时间:2017-09-13 21:27:28

标签: dictionary jpa criteria

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

@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,我什么都没得到

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