我有HQL查询
select new PaymentType(o.paymentType.idPaymentType) from Order as o where o.user='1'
它抛出异常
org.hibernate.PropertyNotFoundException: no appropriate constructor in class: PaymentType
at org.hibernate.util.ReflectHelper.getConstructor(ReflectHelper.java:187)
at org.hibernate.hql.classic.QueryTranslatorImpl.renderSQL(QueryTranslatorImpl.java:631)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:220)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
但是我已经声明了必需的构造函数,除此之外,还声明了其他具有不同count和params类型的树构造函数,也没有params构造函数。
public PaymentType(Integer idPaymentType) {
this.idPaymentType = idPaymentType;
}
修改
public class Order implements java.io.Serializable {
private Integer idOrder;
private PaymentType paymentType;
private DeliveryType deliveryType;
...
}
答案 0 :(得分:0)
值得检查的两件事。 1.try使用PaymentType的完全限定名称
select new com.company.xxx.PaymentType(o.paymentType.idPaymentType)
2.还要确保实体订单中的ID为整数而非长或其他内容。
答案 1 :(得分:0)
在使用Hibernate之前,我已经看到了这个异常。根据我的记忆,它要么与没有参数的构造函数,没有参数的构造函数没有公共访问,要么你的实体类不可序列化。
尝试以下方法:
确保在PaymentType
class:
/**
* Default, parameter-less constructor
*/
public PaymentType() {
}
还有Order
:
/**
* Default, parameter-less constructor
*/
public Order() {
}
确保PaymentType
和Order
都实现java.io.Serializable
。