我正在使用hql生成类JunctionManagementListDto的实际Java对象。但是我最终在控制台上遇到以下异常
org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [JunctionManagementListDto] [SELECT new JunctionManagementListDto(c.siteId, c.name, c.ip, c.customer.id, zm.zone.name) FROM com.traff.hibernate.model.Controllers c, com.traff.hibernate.model.ZoneControllerMapping zm WHERE c.siteId = zm.controller.siteId ]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:255)
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.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
at com.traff.hibernate.generic.GenericDAOImpl.readListByHql(GenericDAOImpl.java:107)
at com.traff.hibernate.daoImpl.JnMgmtLogDaoImpl.getJunctionManagementList(JnMgmtLogDaoImpl.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy175.getJunctionManagementList(Unknown Source)
at com.traff.service.report.JunctionManagementReportService.prepareStatusList(JunctionManagementReportService.java:37)
at com.traff.service.report.JunctionManagementReportService$$FastClassBySpringCGLIB$$472093e1.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
......
我的hql查询是在JnMgmtLogDaoImpl类中编写的,所有必需的导入为
public List<JunctionManagementListDto> getJunctionManagementList(String zoneName, Integer customerId) {
String hql = "SELECT new JunctionManagementListDto(c.siteId, c.name, c.ip, c.customer.id, zm.zone.name) "
+"FROM Controllers c, ZoneControllerMapping zm "
+"WHERE c.siteId = zm.controller.siteId ";
if(zoneName != "")
hql += " and zm.zone.name='"+zoneName+"' ";
if (customerId!=null)
hql += " and zm.controller.customer.id='"+customerId+"' ";
return super.readListByHql(hql);
}
并且JunctionManagementListDto被声明为
公共(public)类JunctionManagementListDto {
private String zoneName;
private Integer siteId;
private String name;
private String ip;
private Integer customerId;
public String getZoneName() {
return zoneName;
}
public void setZoneName(String zoneName) {
this.zoneName = zoneName;
}
public Integer getSiteId() {
return siteId;
}
public void setSiteId(Integer siteId) {
this.siteId = siteId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Integer getCustomerName() {
return customerId;
}
public void setCustomerName(Integer customerId) {
this.customerId = customerId;
}
public JunctionManagementListDto(Integer siteId, String zoneName, String ip, Integer customerId, String junctionName) {
super();
this.siteId = siteId;
this.customerId = customerId;
this.ip = ip;
this.zoneName = zoneName;
name = junctionName;
}
public JunctionManagementListDto(){
}
}
是什么导致此异常,我该如何解决?
最佳答案
我通过指定构造函数的全限定名称解决了此问题。
public List<JunctionManagementListDto> getJunctionManagementList(String zoneName, Integer customerId) {
String hql = "SELECT new (packagename).JunctionManagementListDto(c.siteId, c.name, c.ip, c.customer.id, zm.zone.name) "
+"FROM Controllers c, ZoneControllerMapping zm "
+"WHERE c.siteId = zm.controller.siteId ";
if(zoneName != "")
hql += " and zm.zone.name='"+zoneName+"' ";
if (customerId!=null)
hql += " and zm.controller.customer.id='"+customerId+"' ";
return super.readListByHql(hql);
}