代码之家  ›  专栏  ›  技术社区  ›  Nicolas Sagala Beaucage

具有映射键和值的jpa 2标准

  •  2
  • Nicolas Sagala Beaucage  · 技术社区  · 7 年前

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

    这就是我现在所做的

    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();
    

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

    问题是:我如何用JPA 2.0标准实现我想要的?

    id | SERVER_id | IS_SYNC
    1 | 000000000 1 |正确

    2 | 000000000 3 |假

    如果我要求SERVER_ID=3,我应该得到实体1和2

    如果我要求SERVER_ID=1,我将一无所获

    1 回复  |  直到 7 年前
        1
  •  -2
  •   Nicolas Sagala Beaucage    7 年前

    所以我不能用JPA 2标准来实现,但我用SQL查询成功了。我有一个名为PUNCH的表,映射表是PUNCH\u 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