gpt4 book ai didi

jpa - 使用 JPA SqlResultSetMapping 从多个表读取并填充多个实体

转载 作者:行者123 更新时间:2023-12-02 16:41:12 32 4
gpt4 key购买 nike

我一直在使用 JPA 构建一个 JSF 应用程序来访问数据库。有许多实体。

我想创建一个搜索结果屏幕,显示表中多个实体的列。这些实体没有外键关系。

为了实现此目的,我使用了 EnttityManager.createNativeQuery 并指定了 EntityMapping,如下所示:

 Query q = em.createNativeQuery(
"select t.id as id1, t.bb as bb1, t.cc as cc1," +
"t2.id as id2, t2.aa as aa2, t2.bb as bb2 " +
" from table1 t, table2 t2 where t.cc = '22' and t2.id = 2", "TestMapping");

result = q.getResultList();

测试映射如下所示:

 @SqlResultSetMapping(name =
"TestMapping", entities = {
@EntityResult(entityClass = Table1.class, fields = {
@FieldResult(name = "id", column = "id1"),
@FieldResult(name = "bb", column = "bb1"),
@FieldResult(name = "cc", column = "cc1")}
),
@EntityResult(entityClass = Table2.class, fields = {
@FieldResult(name = "id", column = "id2"),
@FieldResult(name = "aa", column = "aa2"),
@FieldResult(name = "bb", column = "bb2")}
)
} )

如果我指定查询中两个实体的所有列名称,这将起作用,这在这个小示例中很好,但搜索结果必须从 4 个实体中选择,所有这些实体都有一个大的列数。如果我没有指定 EntityMapping 中的所有列,则会在调用 getResultList() 时引发异常。

我的问题是:是否可以仅指定在查询中选择的 EntityMapping 中的列,而不必指定实体中的所有列?

最佳答案

我不知道这是否适用于所有 JPA 实现。如果您使用 Hibernate,您可以使用延迟获取类型映射所有属性:

@Basic(fetch = FetchType.LAZY)
Date dateCreated;

@Column(length=100)
@Basic(fetch = FetchType.LAZY)
String name;

然后您需要检测您的类,否则它将忽略惰性属性:

<target name="instrument" depends="compile">
<taskdef name="instrument" classname="org.hibernate.tool.instrument.InstrumentTask">
<classpath path="${jar.path}"/>
<classpath path="${classes.dir}"/>
<classpath refid="lib.class.path"/>
</taskdef>

<instrument verbose="true">
<fileset dir="${testclasses.dir}/org/hibernate/auction/model">
<include name="*.class"/>
</fileset>
</instrument>

关于jpa - 使用 JPA SqlResultSetMapping 从多个表读取并填充多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292427/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com