PostgreSQL и hibernate - функция rownumber () не существует - PullRequest
0 голосов
/ 06 ноября 2018

В настоящее время я пытаюсь использовать сгенерированные функции Hibernate для базы данных PostgreSQL. Все работает правильно, за исключением случаев, когда я использую функции setFirstResult () и setMaxResults () в моих запросах гибернации.

Вот пример моего кода Java:

String queryString = "select h from History h " ;
Query onePageQuery = getEntityManager().createQuery(queryString)
                .setFirstResult(rowMin).setMaxResults(PAGE_SIZE);
onePageQuery.getResultList();

Сгенерированный запрос выглядит следующим образом:

select
    * 
from
( select
    rownumber() over(
order by
    history0_.DTMTC desc) as rownumber_,
    history0_.ID as ID2_,
    history0_.CCOUL as CCOUL2_,
    history0_.CDIAM as CDIAM2_,
    history0_.CODAV as CODAV2_,
    history0_.COOPVM as COOPVM2_,
    history0_.COOPVT as COOPVT2_,
    history0_.CPOTA as CPOTA2_,
    history0_.DTMTC as DTMTC2_,
    history0_.TYCOUP as TYCOUP2_ 
from
    F23VCM2D history0_ 
order by
    history0_.DTMTC desc ) as temp_ 
where
    rownumber_ <= ?

До того, как я использовал базу данных PostgreSQL, я использовал базу данных DB2. У меня есть файл jpa.xml, в котором я заявляю, что использую базу данных POSTGRESQL следующим образом:

<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="POSTGRESQL" />
    <!-- <property name="database" value="DB2" /> -->
  </bean>
</property>

Я думаю, что, возможно, сгенерированный запрос не адаптирован к PostgreSQL, потому что у меня ошибка: (грубо переводится с французского)

Caused by: org.postgresql.util.PSQLException: ERROR: the function rownumber() Doesn't exist
  Hint : There's no function corresponding to the given name or the arguments types.
You need to add explicit type conversion.

Мои вопросы:

1) Является ли сгенерированный запрос тем, который должен быть сгенерирован? Я сомневаюсь, потому что я пытался отправить его через SQL Developper, и это не удалось.

2) Есть ли что-то очевидное, чего я не делал со своей настройкой гибернации?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Проблема была на моей стороне: было два jpa.xml файла. Я не знал этого, потому что это устаревший проект, в котором я пытаюсь изменить только соединение с базой данных. Поэтому я пытался изменить неправильный файл jpa.xml, чтобы не было влияния на сгенерированные запросы.

Как только я удалил строку "DB2":

<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="DB2" />
  </bean>
</property>

и заменил его строкой «POSTGRE», в правом файле он сработал и запрос был успешно сгенерирован. Поэтому следующая версия jpaVendorAdapter сделала это для меня:

<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="POSTGRESQL" />
  </bean>
</property>

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

0 голосов
/ 06 ноября 2018

Изменить jpaVendorAdapter как это:

<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
     <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQL95Dialect"/>
  </bean>
</property>

для правильной установки спящего диалекта.

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