我一直在使用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();
TestMapping看起来像这样:
@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中的列,而不必指定实体中的所有列?
答案 0 :(得分:0)
我不知道这是否适用于所有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>
答案 1 :(得分:0)
或者您也可以使用语法 entity。* 一次指定'entity'的所有列:
Query q = em.createNativeQuery("select t.*, t2.*" + " from table1 t, table2 t2"+
"where t.cc = '22' and t2.id = 2", "TestMapping");
和TestMapping:
@SqlResultSetMapping(name = "TestMapping",
entities = { @EntityResult(entityClass =Table1.class),
@EntityResult(entityClass =Table2.class)})