当实体之间没有关系映射时,在JPA中连接两个表

时间:2013-08-29 16:57:59

标签: java sql hibernate jpa

我有一个User实体和一个Pet实体。用户和宠物之间没有@OneToMany,@ ManyToMany或其他。原因是每个用户可能有数千只宠物(至少在这个例子中)。因为我不想急于加载它(太慢)而且我不想延迟加载(导致延迟初始化异常...而且我不想在视图过滤器中使用open)我已经创建了方法具有这样名称的用户存储库(原因是我希望有机会只返回关系属性的子集。我不想要用户的所有宠物:

getPetsForUser(final User user){...}。我在JPA中看到的连接示例显然在它看起来的实体上使用了关系属性。我如何在JPA中执行此操作?

在SQL中我只使用外键...

2 个答案:

答案 0 :(得分:1)

您必须显式使用外键,可能是从User对象(我假设为User.getId())中提取外键,然后将其用作原始long或等效内容Pet上的字段 - 没有外键完整性,级联或基于查询的连接。

你可能最好重新审视为什么懒惰加载工作是如此糟糕,如果JPA是正确的方法。

答案 1 :(得分:1)

JPQL仅适用于映射实体和映射关系 一种方法是使用本机SQL查询并将结果管理为List<Object[]> 否则,您可以打开EntityManager以获取Hibernate Session并将结果与​​SQLQuery.setResultTransformer(new AliasToBeanResultTransformer(Pet.class))匹配。
例如:

List<Pet> getPetsForUser(final User user) {
    Session s = entityManager.unwrap(Session.class);
    List<Pet> pets = s.createSQLQuery("select * from PETS p inner join USERS u on (p.user_id = u.id) where u.id = :id").setParameter("id",user.getUserID()).setResultTransformer(new AliasToBeanResultTransformer(Pet.class)).list();
}