JPA低调与待遇

时间:2013-11-19 11:23:16

标签: java jpa eclipselink

我有以下实体层次结构:

A
|-- B
|-- C
|-- D

B,C和D扩展了一个实体。在B和C中我有一个属性“name”,我想从A实体创建一个查询,但我想检索属性“name”(如果存在)。如果它不存在或属性具有null值,则应返回null。

据我所知,我可以使用jpa中的“treat”功能(我们使用的是eclipse链接2.5)。

我正在使用此查询:

        CriteriaBuilder cb = em.getCriteriaBuilder();

        CriteriaQuery query = cb.createQuery(A.class);

        Root root = query.from(A.class);

        Root rootB = cb.treat(root, B.class);
        Root rootC = cb.treat(root, C.class);

        Selection selection = cb.array(
                rootB.get("name"),
                rootC.get("name")
                );

        CriteriaQuery where = query.select(selection);

        List resultList = em.createQuery(where).getResultList();

但生成的SQL不是预期的结果:

SELECT name, name FROM A WHERE ((DTYPE IN (?)) AND (DTYPE IN (?)))) 

创建此查询的最佳方法是什么?在我的真实场景中,有许多A的子类,所以我想避免对实体进行一次查询。

我知道我可以通过两个查询来检索实体A,查找其isInstanceOf并进行另一个查询。我想知道是否有办法只进行一次查询。

由于

0 个答案:

没有答案