java - 连接非实体类中的两个实体

标签 java hibernate jpa jpql sqlresultsetmapping

我想在非实体类中加入两个实体,该类将这两个实体作为该类的属性。

以此为例:

@Entity
public class A {
}

@Entity
public class B {
}

public class C {
    private A a;
    private B b;
}

我找到了一个使用 SqlResultSetMapping 的解决方案,但我不想手动指定 A 和 B 的每一列,因为会有 20 多列。

我发现的另一个解决方案是使用 JPQL 查询,该查询将返回对象数组结果 [ ],其中结果 [0] 是 A,结果 [1] 是 B。

我的想法是两者的结合,我认为它是这样的:

@SqlResultSetMapping(targetClass=C.class, 
entities={
@EntityResult (targetClass=A.class)
@EntityResult (targetClass=B.class)
}

鉴于 A 和 B 都有多个列,哪一个是解决我的问题的最佳方法?

最佳答案

如果您使用 JPQL(它也应该在 hibernate 中工作),您可以利用结果集类策略。

1) 将构造函数添加到您的 C 类中:

public C(A aEntity, B bEntity){
  this.a = aEntity;
  this.b = bEntity;
}

2) 创建普通查询并使用 NEW 运算符和完全限定的 C 类名,该类名将 A 和 B 作为其构造函数参数:

Query query = session.createQuery("select new com.mypkg.C(a as aEntity, b as bEntity) 
                                   from A a, B b where a.id = b.a_id");
List<C> cList = (List<C>)query.list();

关于java - 连接非实体类中的两个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43734789/

相关文章:

java - 如何获取该类中某个字段的字段值

java - 使用 jSTL 功能检查 session 属性

java - 无法更新缓存的 Ebean 实体

java - 是否有与 StringWriter 等效但在 Java 内部具有 StringBuilder 的等效项?

当 LocalDate 为 null 时,Java 8 LocalDate JPA 2.2 坚持到 postgresql Date 失败

c# - .NET 中的 JPA 实现等效于什么?

java - JPA - 无效的 persistence.xml

java - JPA:缓存查询

java - 为什么 Hibernate 似乎是为短暂的 session 而设计的?

Hibernate 谓词 SelectAll