我正在一个现有的(旧的和凌乱的)数据库之上构建一个系统。为此,我在数据库上方构建了一个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.
答案 0 :(得分:1)
也许你可以在你的包装类中通过Multiple Tables注释/映射使用Secondary Tables?
这样,您的包装器可以由四个基础表组成,但为应用程序提供了更清晰的界面。