JPA Criteria API group_concat用法

时间:2011-08-10 02:51:09

标签: jpa group-concat

我目前正在制作一份报告,其中一个字段需要group_concat。

CriteriaQuery<GameDetailsDto> criteriaQuery = criteriaBuilder
                .createQuery(GameDetailsDto.class);
Root<BetDetails> betDetails = criteriaQuery.from(BetDetails.class);
Expression<String> betSelection = betDetails.get("winningOutcome");
criteriaQuery.multiselect(
    // other fields to select
    criteriaBuilder.function("group_concat", String.class, betSelection),
    // other fields to select
    );
//predicate, where clause and other filters

TypedQuery<GameDetailsDto> typedQuery = entityManager.createQuery(criteriaQuery);

这会在行上抛出空指针异常:

TypedQuery<GameDetailsDto> typedQuery = entityManager.createQuery(criteriaQuery);

我错误地使用了criteriaBuilder的函数方法吗?
文件说:

function(String name, Class<T> type, Expression<?>... args);

3 个答案:

答案 0 :(得分:7)

我想出了如何使用Hibernate-jpa-mysql:

1。)创建了一个扩展org.hibernate.dialect.function.SQLFunction的GroupConcatFunction类(这个用于单列group_concat)

public class GroupConcatFunction 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.STRING;
}

@Override
public String render(Type firstArgumentType, List arguments,
        SessionFactoryImplementor factory) throws QueryException {
    if (arguments.size() != 1) {
        throw new QueryException(new IllegalArgumentException(
                "group_concat shoudl have one arg"));
    }
    return "group_concat(" + arguments.get(0) + ")";
}

}


2.)我创建了扩展org.hibernate.dialect.MySQL5Dialect的CustomMySql5Dialect类,并注册了在步骤1中创建的group_concat类
3.)在应用程序上下文中,我更新了jpaVendorAdapter以使用CustomMySql5Dialect作为databasePlatform
4.)最后使用它

criteriaBuilder.function("group_concat", String.class,
        sampleRoot.get("sampleColumnName"))

答案 1 :(得分:1)

简单的解决方案:不要创建整个类,只需使用SQLFunctionTemplate

new SQLFunctionTemplate(StandardBasicTypes.STRING, "group_concat(?1)")

然后在您自己的SQL方言中注册此函数(例如,在构造函数中)

public class MyOwnSQLDialect extends MySQL5Dialect {

  public MyOwnSQLDialect() {
    super();
    this.registerFunction("group_concat", new SQLFunctionTemplate(StandardBasicTypes.STRING, "group_concat(?1)"));
  }
}

答案 2 :(得分:0)

建议的属性:

await

和班级:

spring.jpa.properties.hibernate.metadata_builder_contributor = com.inn.core.generic.utils.SqlFunctionsMetadataBuilderContributor