我有一个User实体和一个Pet实体。用户和宠物之间没有@OneToMany,@ ManyToMany或其他。原因是每个用户可能有数千只宠物(至少在这个例子中)。因为我不想急于加载它(太慢)而且我不想延迟加载(导致延迟初始化异常...而且我不想在视图过滤器中使用open)我已经创建了方法具有这样名称的用户存储库(原因是我希望有机会只返回关系属性的子集。我不想要用户的所有宠物:
getPetsForUser(final User user){...}
。我在JPA中看到的连接示例显然在它看起来的实体上使用了关系属性。我如何在JPA中执行此操作?
在SQL中我只使用外键...
答案 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();
}