在多选中使用函数(或选择(构造(...))会产生NullPointerException(Hibernate 4+),代码如下:
criteriaQuery.select(criteriaBuilder.construct(OrderCriteria.class,
order.get(Order_.id),
criteriaBuilder.function("array_to_string", String.class,
criteriaBuilder.function("array_agg", String.class, employee.<String>get(Employee_.firstName)), criteriaBuilder.literal(",")),
));
抛出以下异常:
java.lang.NullPointerException
org.hibernate.internal.util.ReflectHelper.getConstructor(ReflectHelper.java:354)
org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:185)
我已将异常追溯回Hibernate ConstructionNode :: resolveConstructorArgumentTypes。
似乎在MethodeNode上不存在getDataType()(criteriaBuilder.function创建一个MethodNode),导致NPE:
private Type[] resolveConstructorArgumentTypes() throws SemanticException {
SelectExpression[] argumentExpressions = collectSelectExpressions();
if ( argumentExpressions == null ) {
// return an empty Type array
return new Type[] {};
}
Type[] types = new Type[argumentExpressions.length];
for ( int x = 0; x < argumentExpressions.length; x++ ) {
types[x] = argumentExpressions[x].getDataType(); --> [types[x] == null with MethodNode]
}
return types;
}
构造选择的方式有问题吗?
答案 0 :(得分:0)
几个小时之后,很明显使用非注册函数不能以这种方式使用,导致这个非常不明确的异常。
解决方案:
public class ExtendedPostgreSQL9Dialect extends PostgreSQL9Dialect{
public ExtendedPostgreSQL9Dialect() {
super();
registerFunction("array_agg", new StandardSQLFunction("array_agg", StandardBasicTypes.STRING));
}
}