Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中当实体之间没有关系映射时连接两个表_Java_Sql_Hibernate_Jpa - Fatal编程技术网

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

Java 在JPA中当实体之间没有关系映射时连接两个表,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我有一个用户实体和一个宠物实体。在用户和宠物之间没有@OneToMany、@ManyToMany或其他。原因是每个用户可能有数千只宠物(至少在本例中是这样)。由于我不想急于加载它(太慢),也不想延迟加载(导致延迟初始化异常…并且我不想使用视图中打开的过滤器),所以我在用户存储库中创建了名称如下的方法(原因是我希望有机会只返回关系属性的子集。我不希望用户的所有宠物: getpetsfourser(最终用户){…}。我在JPA中看到的连接示例显然使用了实体上的关系属性。在JPA中如何做到这一点 在S

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

getpetsfourser(最终用户){…}
。我在JPA中看到的连接示例显然使用了实体上的关系属性。在JPA中如何做到这一点


在SQL中,我只会使用外键…

您必须显式地使用外键,可能是从
用户
对象(
User.getId()
)提取它)然后将其用作原始
long
字段或
Pet
上的等效字段——没有外键完整性、级联或基于查询的联接


您最好重新检查一下为什么延迟加载工作是件坏事,以及JPA是否是正确的方法。

JPQL仅适用于映射实体和映射关系。
一种方法是使用本机SQL查询并将结果管理为。
否则,您可以展开
EntityManager
以获得Hibernate
会话
并使用
SQLQuery.setResultTransformer(新别名为BeanResultTransformer(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();
}
List getpetsfourser(最终用户){
sessions=entityManager.unwrap(Session.class);
列出pets=s.createSQLQuery(“从pets中选择*p内部加入用户u on(p.user_id=u.id),其中u.id=:id”).setParameter(“id”,user.getUserID()).setResultTransformer(新别名为BeanResultTransformer(Pet.class)).List();
}

我知道这很旧,但仍然相关。这个答案中唯一缺少的是你需要在
宠物列表的末尾加上链条…
.List()
,否则您将得到一个错误提示:
org.hibernate.internal.SQLQueryImpl不能强制转换为java.util.List
。除此之外,这确实是连接非相关表并将其作为某种对象返回的最佳答案。完成。感谢您的提示。