多选NPE中的JPA / Hibernate功能

时间:2014-08-11 11:38:14

标签: java hibernate jpa jpa-2.0

在多选中使用函数(或选择(构造(...))会产生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;
}

构造选择的方式有问题吗?

1 个答案:

答案 0 :(得分:0)

几个小时之后,很明显使用非注册函数不能以这种方式使用,导致这个非常不明确的异常。

解决方案:

public class ExtendedPostgreSQL9Dialect extends PostgreSQL9Dialect{

    public ExtendedPostgreSQL9Dialect() {
        super();

        registerFunction("array_agg", new StandardSQLFunction("array_agg", StandardBasicTypes.STRING));
    }
}