hibernate - 我们如何在grails标准投影中添加自定义的Aggregate Function?

标签 hibernate grails groovy gorm

我正在尝试使用条件来加强我的查询。在我的查询中,我有最小,最大,计数和Oracle中值函数。
如何创建我的中值函数并在creteria投影部分中调用它?

def getTotalResult() {
    def map= [:]
    def result = Freight.createCriteria()
    def freightResults = result.list {
        projections {
            groupProperty "polCode" // 0
            groupProperty "podCode" // 1
            groupProperty "ctnSize" // 2
            groupProperty "carNam"  // 3
            groupProperty "curCode" // 4
            groupProperty "motCode" // 5
            count()
            min('unitValue')
            max('unitValue')
            med('unitValue')        // HOW CREATE THIS CUSTOM FUNCTION 
        }
    }
    freightResults.each {
        map.put(it[6], it)
    }
    return map
}

最佳答案

我遇到了同样的问题,我想将mysql的createCriteria功能添加到full-text中,所以我看了一下 RLikeExpression.java 并实现了全文,首先我创建了Criterion

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.Oracle8iDialect;
import org.hibernate.engine.spi.TypedValue;

public class MysqlMatchAgainstExpression implements Criterion {

    private static final long serialVersionUID = -2143299180509579568L;

    private final String searchColumns;
    private final String searchValue;

    public MysqlMatchAgainstExpression(String searchColumns, Object searchValue) {
        this.searchColumns = searchColumns;
        this.searchValue = searchValue;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        Dialect dialect = criteriaQuery.getFactory().getDialect();

        def searchColumnsField = this.searchColumns.replace("(", "").replace(")", "").split(",").collect{ it ->
            def columns = criteriaQuery.getColumnsUsingProjection(criteria, it.trim());
            return columns[0]
        }.join(", ")
        return "match (${searchColumnsField}) against (? in boolean mode)"
    }

    public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        //return new TypedValue[] { criteriaQuery.getTypedValue(criteria, searchColumns, searchValue.toString().toLowerCase()) };
        def property = this.searchColumns.replace("(", "").replace(")", "").split(",").first();
        println property
        return [ criteriaQuery.getTypedValue(criteria, property, searchValue.toString()) ] as TypedValue[];
    }

    @Override
    public String toString() {
        return "match ${searchColumns} against ('${searchValue}' in boolean mode)";
    }
}

然后我将HibernateCriteriaBuilder fullTextSearch添加到method
void doWithDynamicMethods() {
    grails.orm.HibernateCriteriaBuilder.metaClass.fullTextSearch= {searchColumns, searchValue->
        addToCriteria(new MysqlMatchAgainstExpression(searchColumns, searchValue));
        return this;
    }
}

我可以这样使用...
User.createCriteria().list{
    fullTextSearch "(name, addressLine1, addressLine2)", 'mordor'
}.each{it ->
    println it.name
}

我知道它本身并不能回答问题,它是一个标准而不是投影,但是我希望在此之后它可以帮助您创建med方法

好吧,我在寻找投影的方式,看起来像这样
public class MedianProjection extends AggregateProjection {
    public MedianProjection (String propertyName) {
        super( "MEDIAN", propertyName );
    }
}

然后添加到HibernateCriteriaBuilder
void doWithDynamicMethods() {
    grails.orm.HibernateCriteriaBuilder.metaClass.med= {propertyName->
        def proj = new MedianProjection (calculatePropertyName(propertyName));

        addProjectionToList(proj, alias);

        return this;
    }
}

让我们动动手指,希望它能起作用:)
def freightResults = result.list {
    projections {
        groupProperty "polCode" // 0
        groupProperty "podCode" // 1
        groupProperty "ctnSize" // 2
        groupProperty "carNam"  // 3
        groupProperty "curCode" // 4
        groupProperty "motCode" // 5
        count()
        min('unitValue')
        max('unitValue')
        med('unitValue')        // HOW CREATE THIS CUSTOM FUNCTION 
    }
}

关于hibernate - 我们如何在grails标准投影中添加自定义的Aggregate Function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738946/

相关文章:

hibernate - Hibernate 3.5/JPA 2.0 的区别

java - Spring-data-jpa @OneToMany 集合未填充

grails - 如何在 grails 中使用 XML 用户文件实现身份验证?

grails - 单个Quartz作业中有多个触发器/Cron表达式

Groovy: "def"关键字与具体类型

java - 无法使用 Java 连接到 Azure 上的 Postgres 数据库

java - 意外的 AST 节点 : < on update query

grails - 按特定属性值对 hql 结果进行排序

Grails - Controller 和 View 之间的通信

grails - 从 "View"发送数据到 "Controller"