Невозможно запросить SQL игнорировать часть WHERE, если параметр имеет значение null - PullRequest
0 голосов
/ 14 сентября 2018

Привет я могу получить данные между временными диапазонами. но если я укажу OR: # {# orgSearch.createdTime.startDateTime} IS NULL, тогда я получаю исключения

это мой @ запрос

 @Query(value = "select o from Organization  o  where (o.createdAt  >:#{#orgSearch.createdTime.startDateTime} OR  :#{#orgSearch.createdTime.startDateTime}  IS NULL)  AND  (o.createdAt <:#{#orgSearch.createdTime.endDateTime}) OR  :#{#orgSearch.createdTime.endDateTime}  IS NULL ")

но я получаю исключения, как показано ниже ......

Caused by: org.postgresql.util.PSQLException: ERROR: could not determine data type of parameter $2
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    at com.sun.proxy.$Proxy139.executeQuery(Unknown Source)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
    ... 95 more

любая помощь, пожалуйста? ..

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Итак, я протестировал этот небольшой обходной путь, о котором упоминал ранее, и он работает с системой типов 5.0-5.3. Предполагая, что ваш класс меток времени в Java равен java.time.Instant, это может работать

if (timestamps == null) {
    query.setParameter("ts", java.time.Instant.EPOCH);
}
query.setParameter("ts", timestamp);

С этого момента ваша следующая проблема заключается в закрытии круглых скобок до OR здесь:

... (o.createdAt <:#{#orgSearch.createdTime.endDateTime}) OR  :#{#orgSearch.createdTime.endDateTime}  IS NULL 

Все это предполагает, что вы создаете запрос, используя entityManager.createNativeQuery(...) самостоятельно, или, возможно, используете именованный собственный запрос, поскольку эти реализации, сгенерированные Spring, не могут добавить обходной путь для вас.

0 голосов
/ 06 августа 2019

Я тоже сталкивался с этой проблемой с PostgreSQL и Instants.Обходной путь, который я использовал для этого, состоит в том, чтобы вручную привести параметр к метке времени, так что если ваш запрос будет выглядеть так:

OR  :#{#orgSearch.createdTime.endDateTime}  IS NULL "

Я бы попробовал что-то вроде:

OR  CAST(:#{#orgSearch.createdTime.endDateTime} AS TIMESTAMP) IS NULL "

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

0 голосов
/ 14 сентября 2018

Решение состоит в том, чтобы заставить PostgreSQL интерпретировать параметр как временную метку.

Отослать этот запрос и сделать свой соответственно.

SELECT *
FROM log
WHERE CASE
  WHEN $P{timestampFrom}::TIMESTAMP IS NULL THEN TIMESTAMP >= '-infinity'
  ELSE TIMESTAMP >= $P{timestampFrom}
  END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...