Hibernate HQL выбрать отдельно от где заказ по запросу - PullRequest
0 голосов
/ 18 октября 2019

Я обновляю проект, чтобы в явном виде знать о клиенте, где ранее предполагался клиент, потому что у нас был только один ...

Моя проблема заключается в добавлении предложения where в мои HQL-запросы.

Моя отправная точка - этот запрос:

  public static final String SELECT_DISTINCT_STORES =
        "select DISTINCT e.storeNum, e.city, e.state from BoEngagement e order by e.storeNum";

Я хочу добавить предложение where e.customer_fk = :customer_fk, но каждый раз, когда добавляю предложение where, я получаю различные ошибки org.hibernate.hql.internal.ast.QuerySyntaxException, если только я не принимаюключевое слово distinct, но тогда я не уверен, что запрос даст мне то, что я ожидаю.

Это работает:

   "select e.storeNum, e.city, e.state from BoEngagement e WHERE e.customer_fk = :customer_fk";

И, если я собираюсьчтобы упростить этот запрос, он действительно должен быть

"select e from BoEngagement e WHERE e.customer_fk = :customer_fk";

Однако, как я уже сказал, я не уверен, что удаление ключевого слова distinct - это то, что я хочу сделать.

ЗдесьВот некоторые вещи, которые я пробовал:

   "select DISTINCT e.storeNum, e.city, e.state FROM BoEngagement e WHERE e.customer_fk = :customer_fk order by e.storeNum";

выдает эту ошибку

[ERROR] 2019-10-18 15:10:03.449 [main] BsRetrieveDistinct - java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FROM near line 1, column 94 [SELECT DISTINCT e.city, e.state from com.bh.radar.bo.BoEngagement e order by e.state, e.city FROM com.bh.radar.bo.BoEngagement e WHERE e.customer_fk = :customer_fk]
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FROM near line 1, column 94 [SELECT DISTINCT e.city, e.state from com.bh.radar.bo.BoEngagement e order by e.state, e.city FROM com.bh.radar.bo.BoEngagement e WHERE e.customer_fk = :customer_fk]

, а эта более сложная версия

   "select DISTINCT e.storeNum, e.city, e.state FROM BoEngagement e in " +
        "(select g FROM BoEngagement g WHERE g.customer_fk = :customer_fk order by g.storeNum)";

выдает эту ошибку

[ERROR] 2019-10-18 15:08:14.317 [main] BsRetrieveDistinct - java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: in near line 1, column 81 [select DISTINCT e.storeNum, e.city, e.state FROM com.bh.radar.bo.BoEngagement e in (select g FROM com.bh.radar.bo.BoEngagement g WHERE g.customer_fk = :customer_fk order by g.storeNum)]
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: in near line 1, column 81 [select DISTINCT e.storeNum, e.city, e.state FROM com.bh.radar.bo.BoEngagement e in (select g FROM com.bh.radar.bo.BoEngagement g WHERE g.customer_fk = :customer_fk order by g.storeNum)]

Очевидно, я не полностью понимаю HQL и ключевое слово distinct. Что я делаю не так?

Редактировать:

@ Дж. Б. Низет прокомментировал, что, основываясь на опубликованной мной ошибке, он не думает, что я выполняю запрос, который явывешенный. Я абсолютно выполняю этот запрос. Моя загадка - почему HQL, который я написал, генерирует два предложения FROM в SQL. Я вставил скриншот ниже, показывающий соответствующий код и сообщение об ошибке.

Screen shot of code and error message

1 Ответ

0 голосов
/ 21 октября 2019

Возможно, это не ответ на мой первоначальный вопрос, но поиск в Интернете в течение нескольких дней и размещение моего вопроса здесь не выявили ничего, что могло бы генерировать вменяемый запрос PostgreSQL из различных строк JPQL, которые я пробовал, поэтому я наткнулся на этосообщение в блоге: Многогранность DISTINCT в PostgreSQL

И оттуда начали исследовать метод EntityManager.createNativeQuery и придумали этот запрос PostgreSQL, который работает:

  public static final String SELECT_DISTINCT_STORES =
         "SELECT DISTINCT ON(storeNum, city, state) * FROM radar2.engagement WHERE customer_fk = :customer_fk ORDER BY storeNum asc, city, state";

и я использую его таким образом:

    results = em.createNativeQuery(SELECT_DISTINCT_CITY_STATES, BoEngagement.class)
                .setParameter("customer_fk", customer_fk)
                .getResultList();

Теперь это решение относится только к PostgreSQL, но это база данных, которую я использую сейчас и на неопределенное будущее.

...