当前位置: 首页 > 面试题库 >

具有HQL的新对象-StandardAnsiSqlAggregationFunctions上的NPE,确定为JdbcTypeCode

澹台举
2023-03-14
问题内容

我知道这个问题已经提出了很多,但是我似乎遇到了一个不同的问题。我看到Hibernate中有一个错误,该错误与SumFunction忽略了自定义用户类型有关,但据我所知,我没有使用自定义用户类型。我基本上是试图创建一个新对象,该对象是现有映射bean的汇总,但是我收到了NullPointerException针对某些Hibernate方言函数的。我尝试将Double和BigDecimal都用作value字段类型,但在部署时都向我提供了相同的错误消息。请帮忙!

这是一些代码

映射的豆:

@Entity
@Table(name = "v_summary_report")
public class SummaryReportView implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id")
    private String id;

    @Column(name = "region")
    private String region;

    @Column(name = "market")
    private String market;

    @Column(name = "proj_year_month")
    private String projectionYearMonth;

    @OneToOne(cascade={CascadeType.DETACH})
    @JoinColumn(name="attrib_id", referencedColumnName="attrib_id")
    private Attribute attribute;

    @Column(name = "total_value")
    private BigDecimal value;

    /* other stuff */
}

命名查询被调用:

    @NamedQuery(name = "findSummaryReportTotalByRegion", query = " SELECT new com.rac.projections.bean.SummaryReportTotal(srv.projectionYearMonth, srv.attribute, sum(value)) from SummaryReportView srv where srv.region = :region group by srv.projectionYearMonth, srv.attribute"),

Bean总定义:

public class SummaryReportTotal {

    private String projectionYearMonth;
    private Attribute attribute;
    private BigDecimal value;

    public SummaryReportTotal() {
        super();
    }

    public SummaryReportTotal(String projectionYearMonth, Attribute attribute, BigDecimal value) {
        this.projectionYearMonth = projectionYearMonth;
        this.attribute = attribute;
        this.value = value;
    }

    /* other stuff */
}

堆栈跟踪 :

Caused by: java.lang.NullPointerException
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$SumFunction.determineJdbcTypeCode(StandardAnsiSqlAggregationFunctions.java:145)
at org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions$SumFunction.getReturnType(StandardAnsiSqlAggregationFunctions.java:157)
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:406)
at org.hibernate.hql.internal.ast.tree.AggregateNode.getDataType(AggregateNode.java:83)
at org.hibernate.hql.internal.ast.tree.ConstructorNode.resolveConstructorArgumentTypes(ConstructorNode.java:166)
at org.hibernate.hql.internal.ast.tree.ConstructorNode.prepare(ConstructorNode.java:141)
at org.hibernate.hql.internal.ast.HqlSqlWalker.processConstructor(HqlSqlWalker.java:1019)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2150)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2016)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1451)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:571)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:1032)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:506)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 45 more

问题答案:

如果value以表别名作为前缀,我不会感到惊讶,因为其他字段可以解决该问题

... sum(srv.value) ...

有时,HQL解析器在解析步骤中将标识符解析为有效,但是在执行期间会因奇怪的异常而失败。



 类似资料:
  • 问题内容: 我知道这个问题已经提出了很多,但是我似乎遇到了另一个问题。我看到Hibernate 中有一个bug,它与SumFunction忽略了自定义用户类型有关,但是据我所知,我没有使用自定义用户类型。我基本上是在尝试创建一个新对象,该对象是现有映射bean的汇总,但是我收到了针对某些Hibernate方言函数的。我尝试将Double和BigDecimal都用作字段类型,但在部署时都向我提供了相

  • 问题内容: 试图从HQL查询创建对象,但无法弄清楚我在做什么错。 查询: (或者我应该使用新的MyCustomList(product.code,SUM(…,即使未映射)?)现在我想将此返回的列表转换为类似的对象: 检索数据: 使用Play框架 问题答案: 我认为第15.6节。select子句涵盖您要实现的目标: 15.6。选择子句 … 查询可以将多个对象和/或属性作为类型数组返回 : 或作为:

  • 问题内容: 考虑以下之一: 在这里,Sysout必须使用String。因此,必须在实例上调用toString()。 那么为什么null.toString()很棒呢?Sysout会照顾这个吗? 编辑:其实我用StringBuilder的append()看到了这怪异的东西。因此尝试了Sysout。两者的行为方式相同。那该方法也要注意吗? 问题答案: 的调用(即编写时调用的方法),如Javadoc中所述

  • 第2章和第3章 有关对象的思考 一节完成了电梯模拟程序面向对象设计的前两步,即确定实现电梯模拟程序的类和这些类的属性。 本节要确定实现电梯模拟程序所需的类行为。第5章将介绍这些类对象之间的交互。 下面要考虑一些实际类对象的行为。收音机的行为包括可以选台和设置音量。汽车的行为包括加速(按油门板)和减速(按制动闸)。 可以看出,对象通常不是自动做出行为,而是在向对象发出消息(message)时调用特定

  • 是否可以使用更新对象的属性? 类似于: 我试过: 还有这个: 第一个会导致语法错误,而第二个则什么也不做。有什么想法吗?

  • 第2章“有关对象的思考”一节开始了关于电梯模拟程序的面向对象设计(OOD)的第一个阶段,即确定实现电梯模拟程序所需要的对象。作为入手点,可以列出问题陈述中的名词,这样就可 以发现电梯模拟程序中的对象有电梯、人、楼层、大楼、各种按钮、时钟、电灯与电铃等等。 第1章介绍对象时曾经指出过对象有属性和行为。对象属性在C++程序中表示为数据,对象行为在C++程序中表示为函数。本节要确定实现电梯模拟程序所需对