如何在没有数据库中的相应表的情况下将包装器对象用作JPA实体

时间:2014-10-08 14:14:20

标签: jpa wrapper jpql

我正在一个现有的(旧的和凌乱的)数据库之上构建一个系统。为此,我在数据库上方构建了一个JPA层,但我不想将我的域对象直接映射到现有的数据库表。

我目前有一个包装器对象,它在数据库中封装了4个实体(来自4个表的数据)。有没有办法可以将这个包装类用作JPQL查询中的参数?

如果包装类本身有点像JPA实体,但没有相应的数据库表,那将是很好的。这可以实现,如果是,如何实现?


例如,我应该如何更改Wrapper

public class Wrapper {
    private FirstJpaEntity first;
    private SecondJpaEntity second;
}

这样我就可以使用像

这样的东西
List<Wrapper> wrappers = ...;

TypedQuery<Wrapper> query = entityManager.createQuery(
              "SELECT wrap" // This is probably where the problem lies: JPA needs a Type for `wrap`, but this type needs to be an @Entity which `wrap` is not
            + " WHERE wrap IN :wrappers"
            + "   AND wrap.first.property = 1"
            + "   AND wrap.second.property = 2"
            , Wrapper.class);

query.setParameter("wrappers", wrappers);

我考虑让Wrapper成为@Embeddable,希望JPQL可以弄清楚如何浏览它,但是唉@Embeddable objects cannot be queried directly.

1 个答案:

答案 0 :(得分:1)

也许你可以在你的包装类中通过Multiple Tables注释/映射使用Secondary Tables

这样,您的包装器可以由四个基础表组成,但为应用程序提供了更清晰的界面。