Как связать представление PostgreSQl с Hibernate в Java? - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть веб-приложение на Java, которое использует Hibernate ORM для подключения к базе данных.Существует много таблиц базы данных, в основном настроенных как hibernate xml mapping files, то есть hbm.xml, где каждый файл является таблицей в базе данных.

Теперь вопрос в том, что - есть представление, созданное с помощью postgreSQl в базе данных, и я хочу использовать это представление в Java, как это сделать?Если я создам еще один hbm.xml файл, это будет таблица, созданная в базе данных.Я читал через Интернет, есть примеры того, как использовать его с аннотациями, но я не настроил его в своем веб-приложении.

Обновление 1:

После некоторых исследований и рекомендаций по ответу ниже, у меня есть атм:

Я создал xml файл отображения и класс Java с getters /сеттеры для каждого свойства:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"

>

<hibernate-mapping>
<class name="org.xxx.model.SearchView" table="search" mutable="false">

    <id name="uuId" column="uuid">

    </id>


    <property name="typeOfCRA" column="typeofcra" />

    <property name="birthDate" column="birthDate" />

    <property name="lastName" column="lastname" />

    <property name="firstName" column="firstname" />

    <property name="middleName" column="middlename" />

    <property name="recordId" column="recordid" />

    <property name="registrationDate" column="registrationdate" />

    <property name="state" column="state" />

    <property name="organisationunitId" column="organisationunitid" />

    <property name="version" column="version" />

    <property name="gender" column="gender" />


</class>
</hibernate-mapping>

Вот как я вызываю его в java для получения списка результатов из базы данных:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeofcra", "birth"));
List<SearchView> tmp =criteria.list();

Это ничего не дает никаких ошибок.Он возвращает 0 записей на основе моих критериев.Но когда я отфильтровываю его непосредственно в Postgresql с теми же критериями, он возвращает почти 600 тыс. Результатов.

Во время компиляции или выполнения этого фрагмента кода также появляются 0 ошибок.Любая помощь приветствуется.

Обновление2:

Конфиденциальный файл конфигурации:

connection.dialect = org.hibernate.dialect.PostgreSQLDialect
connection.driver_class = org.postgresql.Driver
connection.url = jdbc:postgresql://localhost:5432/finalDb
connection.username = postgres
connection.password = root
connection.schema = update

Обновлен код, основанный на ответе ниже:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%"));
List<SearchView> tmp =criteria.list();

Прямой вызовв PgAdmin работает:

SELECT typeofcra, dateofbirth, lastname, firstname, middlename, recordid, 
   registrationdate, state, organisationunitid, uuid, version, gender
 FROM public.search where typeofcra like '%birth%';

Но из Java это не работает.

Ответы [ 4 ]

2 голосов
/ 07 мая 2019

Согласно вашему файлу отображения спящего режима, опубликованному выше, в вашей сущности SearchView есть поле typeOfCRA.Проблема с вашим Restriction.Если вы хотите выполнить операцию like, вы можете сделать это следующим образом

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(SearchView.class);

criteria.add(Restrictions.like("typeOfCRA", "%birth%")); //Changed code here
List<SearchView> tmp =criteria.list();

Вышеупомянутый запрос извлечет все записи, в которых typeofcra содержит birth.Если вы хотите выполнить поиск без учета регистра, вы можете использовать ограничение ilike.

Обновление

Проблема связана с именем вашего файла отображения Hibernate.Имя файла отображения Hibernate должно совпадать с именем вашего объекта / класса.В имени файла сопоставления гибернации класса SearchView есть орфографическая ошибка.Измените имя файла с Searview.hbm.xml -> SearchView.hbm.xml, оно должно решить вашу проблему

0 голосов
/ 08 мая 2019

Может отображаться как любой стол.Просто определите имя и столбцы.Стандартные таблицы не доступны только для чтения, но вы не можете обновлять представления.Вы можете сделать это, аннотируя свою сущность аннотацией @Immutable в Hibernate.

@Entity 
@Immutable 
public class MyCustomView { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", updatable = false, nullable = false) 
    private Long id; 

    ...

}

Теперь Hibernate будет выполнять только SELECT, но не UPDATE, если вы измените какое-либо значение.

0 голосов
/ 07 мая 2019

Если вы можете использовать аннотацию, попробуйте ссылку ниже https://thoughts -on-java.org / hibernate-tips-map-view-hibernate /

0 голосов
/ 20 апреля 2019

Вы можете создать объект для просмотра и установить mutable="false",

<hibernate-mapping>
    <class name="com.MyView" mutable="false">
       <!--properties-->
    </class>
</hibernate-mapping>

Тогда используйте,

List<MyView> bvs = em.createQuery("SELECT v FROM MyView v", MyView.class).getResultList();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...