2011-12-21 2 views
4

У меня есть приложение, которое использует Spring и Hibernate. В моей базе данных есть некоторые представления, которые мне нужно загрузить в некоторых объектах. Так что я пытаюсь выполнить родной запрос и загрузить данные класса Withthe, извлекаемые с точки зрения:Загрузить объект из представления в JPA/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: Unknown entity

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

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

Так что я пришел в эти вопросы:

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

Благодаря

+0

FWIW, Другие реализации JPA поддерживают класс результатов, который не является сущностью, а спецификация JPA 2.0 ничего не говорит только о типах Entity. – DataNucleus

ответ

2

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

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

1

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

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

Попытка: я получаю эту ошибку: «ERROR org.hibernate.property.BasicPropertyAccessor ожидаемый тип: java.lang.Long, фактическое значение: java.math.BigInteger». Должен ли я устанавливать все числа в BigInteger или есть способ, которым он может передать их Long? (эти числа относятся к другому объекту, который является длинным значением). – Javi

+0

@Javi: Вы можете объявлять поля своего класса как «BigInteger» или применять явные приведения к столбцам в вашем SQL-запросе (вместо '*'). – axtavt

7

Размещенные на классе

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

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

Смежные вопросы