【问题标题】:Spring Hibernate Criteria API Builder pass list parameter to functionSpring Hibernate Criteria API Builder 将列表参数传递给函数
【发布时间】:2021-03-27 23:54:29
【问题描述】:

我尝试在 Criteria API Builder 中实现 MySQL 全文搜索,但我坚持在自定义函数中传递多列列表。

自定义 MySQL 方言以启用 MATCH AGAINST 功能:

import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;

public class CustomMySQL5Dialect extends MySQL5Dialect {

    public CustomMySQL5Dialect() {
        super();
        registerFunction("match", new SQLFunctionTemplate(StandardBasicTypes.DOUBLE, "match(?1) against (?2 in boolean mode)"));
    }
}

楼盘查询客服部分:

Specification.where((root, query, cb) -> {
    Expression<Double> match = cb.function(
        "match", 
        Double.class,
        root.get(Customer_.FIRST_NAME),
        cb.literal("mySearchTerm")
    );
    return cb.greaterThan(match, 0.);
});

但现在我想扩展全文搜索以搜索多列。最终 SQL 应如下所示:

SELECT * FROM customer WHERE MATCH (first_name,last_name) AGAINST ('mysearchterm' IN BOOLEAN MODE) > 0.0 

那么,有谁知道如何为第一个参数传递列名列表。

【问题讨论】:

    标签: spring spring-boot hibernate jpa hibernate-criteria


    【解决方案1】:
    public class MariaDB10Dialect extends org.hibernate.dialect.MariaDB10Dialect {
    
        public MariaDB10Dialect() {
            registerFunction("match", new SQLFunction() {
    
                @Override
                public boolean hasArguments() {
                    return true;
                }
    
                @Override
                public boolean hasParenthesesIfNoArguments() {
                    return false;
                }
    
                @Override
                public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
                    return StandardBasicTypes.DOUBLE;
                }
    
                @Override
                public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) throws QueryException {
                    StringBuilder sb = new StringBuilder("match(");
                    int i=0;
                    for (i=0; i<arguments.size()-1; i++) {
                        if (i>0)
                            sb.append(", ");
                        sb.append(arguments.get(i));
                    }
                    sb.append(") against (").append(arguments.get(i)).append(")");
                    return sb.toString();
                }
            });
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2016-08-17
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 2012-03-07
      • 2015-06-06
      相关资源
      最近更新 更多