QuerySyntaxException:无法找到类

时间:2016-08-24 11:45:20

标签: java hibernate hql

我正在使用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 class 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(){

}
}

导致此异常的原因是什么?如何解决?

1 个答案:

答案 0 :(得分:12)

我通过指定构造函数的完全限定名称来解决此问题。

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);        
}