1

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

getPetsForUser(final User user){...}. 我在 JPA 中看到的连接示例显然使用了实体上的关系属性。我如何在 JPA 中做到这一点?

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

4

2 回答 2

1

JPQL 仅适用于映射实体和映射关系。
一种方法是使用本机 SQL 查询并将结果管理为List<Object[]>.
否则,您可以打开包装EntityManager以获得 HibernateSession和 mappign 结果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();
}
于 2013-08-29T17:46:53.200 回答
1

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

您最好重新检查一下为什么让延迟加载工作如此糟糕,以及 JPA 是否是正确的方法。

于 2013-08-29T17:03:23.207 回答