Чтение из нескольких таблиц и заполнение нескольких объектов с использованием JPA SqlResultSetMapping

StackOverflow https://stackoverflow.com/questions/1292427

Вопрос

Я создавал приложение JSF, используя JPA для доступа к базе данных.Существует целый ряд сущностей.

Я хочу создать экран результатов поиска, который показывает столбцы из более чем одного объекта в таблице.Эти объекты не имеют связей с внешним ключом.

Чтобы достичь этого, я использовал EntityManager.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() генерируется исключение.

Мой вопрос заключается в следующем:Можно ли указать только столбцы в сопоставлении сущностей, которые выбраны в запросе, вместо того, чтобы указывать все из сущностей?

Это было полезно?

Решение

Я не знаю, работает ли это со всеми реализациями JPA.Если вы используете гибернацию, вы можете сопоставить все свои свойства с типом отложенной выборки:

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

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

Затем вам нужно настроить свой classed, иначе он будет игнорировать отложенные свойства:

<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>

Другие советы

Или вы также можете использовать синтаксис сущность.* чтобы указать все столбцы 'entity' сразу:

Query q = em.createNativeQuery("select t.*, t2.*" + " from table1 t, table2 t2"+
                               "where t.cc = '22' and t2.id = 2", "TestMapping");

И тестовое отображение:

@SqlResultSetMapping(name = "TestMapping", 
entities = { @EntityResult(entityClass =Table1.class), 
             @EntityResult(entityClass =Table2.class)})
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top