【问题标题】:Convert(DATE, expr) to be implemented using CriteriaBuilder for Sql serverConvert(DATE, expr) 使用 CriteriaBuilder for Sql server 实现
【发布时间】:2021-11-20 19:10:14
【问题描述】:

我正在使用 spring-data-jpa 并使用 Specification 类实现动态查询。 db的Sql Server版本是2019

有一个查询,我需要将 datetime(timestamp) 截断为仅日期部分(没有时间),然后应用 where 条件。 查询是这样的:

select a from Table1 a where convert(DATE,date_col)>?

问题在于第一个参数,即DATE(this is actually a datatype and not a literal)

我的代码在 toPredicate 方法中运行,描述为:

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) 

我曾尝试使用criteriabuilder.function 方法,但无法理解如何在函数中包含 DATE(数据类型)。

【问题讨论】:

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


    【解决方案1】:

    如果你想呈现这个 SQL,你必须向 Hibernate 注册一个自定义的 SQLFunction 来完成这个。

    public class TruncateDate 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 firstArgumentType;
        }
    
        @Override
        public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException {
            return "convert(DATE," + args.get(0) + ")";
        }
    }
    

    您必须在方言中注册该功能。

    因此,如果方言按照指示进行扩展,则可以通过以下方式完成:

    this.registerFunction("trunc_date", new TruncateDate());
    

    那么你可以这样使用它:criteriaBuilder.function('trunc_date', root.get("dateAttribute"))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多