Загрузить объект из представления в JPA / Hibernate - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть приложение, которое использует Spring и Hibernate. В моей базе данных есть некоторые представления, которые мне нужно загрузить в некоторые объекты. Поэтому я пытаюсь выполнить собственный запрос и загрузить класс с данными, полученными из представления:

//In my DAO class (@Repository) 
public List<MyClass> findMyEntities(){
    Query query = em.createNativeQuery("SELECT * FROM V_myView", MyClass.class);
    return query.getResultList();
}

и MyClass имеет те же поля, что и имена столбцов представления.

Проблема в том, что Hibernate не может распознать MyClass, потому что это не сущность (она не помечена @Entity)

org.hibernate.MappingException: неизвестная сущность

Если я добавлю MyClass в качестве объекта, система попытается создать / обновить таблицу для этого объекта, потому что я настроил его:

<property name="hibernate.hbm2ddl.auto" value="update"/>

Итак, я вхожу в эти вопросы:

  1. Могу ли я отключить "hibernate.hbm2ddl.auto" только для одного объекта?
  2. Есть ли способ загрузить данные из представления в не-сущностный класс?
  3. Если нет, то как лучше всего в моем случае загрузить данные из представления в класс в hibernate?

Спасибо

Ответы [ 3 ]

7 голосов
/ 21 декабря 2011

Размещено на вашем классе

@Entity
@Immutable
@Subselect(QUERY)
public MyClass {....... }

Hibernate выполняет запрос для извлечения данных, но не для создания таблицы или представления. Недостатком этого является то, что он служит только для чтения.

2 голосов
/ 21 декабря 2011

Вы можете использовать axtavt solution . Вы также можете просто выполнить свой запрос и преобразовать List<Object[]>, который будет явно возвращен в List<MyClass>. Или вы можете отобразить свое представление как объект, доступный только для чтения, что, вероятно, является лучшим решением, поскольку оно позволяет связываться с другими таблицами, выполнять запросы через JPQL, Критерии и т. Д.

На мой взгляд, hibernate.hbm2ddl.auto следует использовать только для быстрых и грязных прототипов. Используйте инструменты hibernate для генерации файла SQL, позволяющего создать схему, и измените ее, чтобы удалить создание представления. В любом случае, если он настроен на обновление, не следует ли пропустить создание таблицы, поскольку она уже существует (как представление)?

1 голос
/ 21 декабря 2011

Вы можете использовать AliasToBeanResultTransformer. Поскольку это особенность Hibernate, вам необходимо получить доступ к базовому Hibernate Session:

return em.unwrap(Session.class)
         .createSQLQuery("...")
         .setResultTransformer(new AliasToBeanResultTransformer(MyClass.class))
         .list(); 
...