【问题标题】:JPA criteria API uses SQL server convert functionJPA 标准 API 使用 SQL server 转换功能
【发布时间】:2022-10-04 23:42:22
【问题描述】:

我的数据库具有字符串类型的“m_date”,并将日期存储为“dd-MM-yyyy”格式。现在我想借助过滤器之间的 JPA 条件查询从表中获取记录。 现在,由于 m_date 存储字符串日期,我不能直接使用 criteriaBuilder.between 函数。但在此之前,我需要使用 SQL 内置函数 CONVERT(date, m_date, 103) 将其转换为 Date。我尝试了类似将字符串日期转换为日期的方法。

SQL查询是这样的

SELECT myId from table where status='PENDING' and CONVERT(date, m_date,103) between fromDate and toDate)

标准 API

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> criteriaQuery = criteriaBuilder.createQuery(MyEntity.class);
Root<MyEntity> root = criteriaQuery.from(MyEntity.class);

Predicate statusPredicate = cb.equal(root.get("status"), cb.literal("PENDING"));

Expression<String> convertFunction = cb.function("CONVERT", String.class, cb.literal("date"), root.get("mDate"), cb.literal(103));
Predicate datePredicate = cb.between(convertFunction, fromDate, toDate); // fromDate and toDate coming from request...

CriteriaQuery<MyEntity> myQuery = criteriaQuery.select(root.get("myId")).where(statusPredicate, datePredicate);

TypedQuery<MyEntity> query = entityManager.createQuery(myQuery);
return query.getResultList();

我收到类似这样的错误

Hibernate: select myentity_0.my_id as col_0_0_ from table where myentity_0.status=? and (CONVERT(?,myentity.m_date,103) between ? and ?)
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '@P1'.

有人可以帮我吗,我如何将“日期”作为转换函数的第一个参数?我被困了这么久。帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: hibernate jpa spring-data-jpa jpa-2.0 criteria-api


    【解决方案1】:

    您应该可以改用root.get("mDate").as(java.sql.Date.class)。如果这不起作用,您将不得不创建一个自定义 SQLFunction 例如convert_date 在 Hibernate 中并调用它:

    Expression<Date> convertFunction = cb.function("convert_date", Date.class, root.get("mDate"));
    

    这应该呈现您想要的 SQL。可能看起来像这样:

    public class ConvertDateFunction implements SQLFunction {
    
        @Override
        public boolean hasArguments() {
            return true;
        }
    
        @Override
        public boolean hasParenthesesIfNoArguments() {
            return true;
        }
    
        @Override
        public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
            return StandardBasicTypes.DATE;
        }
    
        @Override
        public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException {
            return "convert(date," + args.get(0) + ",103)";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 2017-04-18
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2021-10-16
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多