Проблема с функцией H2 DATEDIFF при использовании API Criteria - PullRequest
0 голосов
/ 08 марта 2020

Существует простая сущность Элемент с двумя свойствами типа даты:

@Entity
public class Item {

@Id
@GeneratedValue(generator = Constants.ID_GENERATOR)
protected Long id;

@NotNull
protected String name;

@NotNull
protected Date from;

@NotNull
protected Date to

Я хочу использовать основную функцию базы данных H2 "DATEDIFF" , используя Критерии API. Поэтому у меня есть следующий фрагмент кода для этого:

CriteriaQuery<Item> criteria = cb.createQuery(Item.class);
Root<Item> i = criteria.from(Item.class);
criteria.select(i).where(
      cb.gt(
            cb.function(
                        "DATEDIFF",
                        Integer.class,
                        cb.literal("DAY"),
                        i.get("from"),
                        i.get("to")
            ),
            1
      )
);
... // other code to handle result 

Когда я пытаюсь выполнить запрос, я получаю эту ошибку:

WARN org.hibernate.engine.jdb c .spi.SqlExceptionHelper - SQL Ошибка: 90008, SQLState: 90008 ОШИБКА org.hibernate.engine.jdb c .spi.SqlExceptionHelper - Неверное значение "1" для параметра "parameterIndex" [90008-200] в org.h2 .message.DbException.getJdbcSQLException (DbException. java: 590) в org.h2.message.DbException.getJdbcSQLException (DbException. java: 429) в org.h2.message.DbException.get (DbException. java : 205) в org.h2.message.DbException.getInvalidValueException (DbException. java: 280) в org.h2.jdb c .JdbcPreparedStatement.setParameter (JdbcPreparedStatement. java: 1503) в org.h c .JdbcPreparedStatement.setString (JdbcPreparedStatement. java: 413) в org.hibernate.type.descriptor. sql .VarcharTypeDescriptor $ 1.doBind (VarcharTypeDescriptor. java: 46. org type) или в коде типа *. . sql .BasicBinder.bind (BasicBinder. java: 73) в org.hi bernate.type. *: 53) в org.hibernate.loader.hql.QueryLoader.bindParameterValues ​​(QueryLoader. java: 648) в org.hibernate.loader.Loader.prepareQueryStatement (Loader. java: 2120) в org.hibernate.loader .Loader.executeQueryStatement (Loader. java: 2034) в org.hibernate.loader.Loader.executeQueryStatement (Loader. java: 2012) в org.hibernate.loader.Loader.doQuery (Загрузчик. java: 953 ) в org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader. java: 354) в org.hibernate.loader.Loader.doList (Loader. java: 2815) в org.hibernate.loader.Loader.doList ( Loader. java: 2797) в org.hibernate.loader.Loader.listIgnoreQueryCache (Loader. java: 2629) в org.hibernate.loader.Loader.list (Loader. java: 2624) в org.hibernate. .loader. hql.QueryLoader.list (QueryLoader. java: 506) в org.hibernate.hql.internal.ast.QueryTranslatorImpl.list (QueryTranslatorImpl. java: 396) в org.hibernate.engine.query.spi.lanQu. executeList (HQLQueryPlan. java: 219) в org.hibernate.internal.SessionImpl.list (SessionImpl. java: 1396) в org.hibernate.query.internal.AbstractProducedQuery.doList (AbstractProducedQuery. java: 1558) в org.hibernate.query.internal.AbstractProducedQuery.list (AbstractProducedQuery. java: 1526) в org.hibernate.query.Query.getResultList (Query. java: 165) в org.hibernate.query.criteria.internal .compile.CriteriaQueryTypeQueryAdapter.getResultList (CriteriaQueryTypeQueryAdapter. java: 76) в com.ico.ltd.querying.domain.Restriction.executeQueries (ограничение. java: 329)

* 1016, если I 1016 используйте JPQL:
 select i from Item i where function('DATEDIFF', 'DAY', i.from, i.to) > 1

Завершается без проблем. Более того, если я переключу версию H2 на 1.3.171, Criteria API будет работать нормально. Я использую следующие версии H2 и Hibernate 1.4.200 , 5.4.8. Final соответственно. Может ли кто-нибудь помочь с этим?

...