我目前正在制作一份报告,其中一个字段需要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);
答案 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