java - 为什么我在这个 Spring 项目中获得与命名查询相关的 HibernateException?

标签 java sql spring hibernate

我在 Hibernate 和 Spring 开发方面绝对是新手,我有以下问题

我有一个名为 KM_ProjectInfoStatus 的实体类,它映射一个名为 KM_PROJECT_INFO_STATUS 的数据库表,所以我有这个类:

package egp.prc.km.model;

import javax.persistence.*;
import java.io.Serializable;

@NamedQueries({
        @NamedQuery(name = "kmProjectInfoStatusList", query = "select status from KM_PROJECT_INFO_STATUS status order by status.idProjectInfoStatus") ,
        @NamedQuery(name = "kmProjectInfoStatusById", query = "SELECT status FROM KM_PROJECT_INFO_STATUS status where lower(status.idProjectInfoStatus) = :statusId")
})

@Entity
@Table(name = "KM_PROJECT_INFO_STATUS")
public class KM_ProjectInfoStatus implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfoStatus;

    @Column(name = "foldertech")
    private Long foldertech;

    @Column(name = "folderproject")
    private Long folderproject;

    public Long getIdProjectInfoStatus() {
        return idProjectInfoStatus;
    }

    public void setIdProjectInfoStatus(Long idProjectInfoStatus) {
        this.idProjectInfoStatus = idProjectInfoStatus;
    }

    public Long getFoldertech() {
        return foldertech;
    }

    public void setFoldertech(Long foldertech) {
        this.foldertech = foldertech;
    }

    public Long getFolderproject() {
        return folderproject;
    }

    public void setFolderproject(Long folderproject) {
        this.folderproject = folderproject;
    }
}

正如您在前面的代码片段中看到的,在该类上定义了 2 个命名查询,这些:

@NamedQueries({
        @NamedQuery(name = "kmProjectInfoStatusList", query = "select status from KM_PROJECT_INFO_STATUS status order by status.idProjectInfoStatus") ,
        @NamedQuery(name = "kmProjectInfoStatusById", query = "SELECT status FROM KM_PROJECT_INFO_STATUS status where lower(status.idProjectInfoStatus) = :statusId")
})

1) 第一个名为 kmProjectInfoStatusList,并从我的 KM_PROJECT_INFO_STATUS 表中选择行列表。

2) 第二个名为 kmProjectInfoStatusById,并使用 where 条件中的 ID 从我的 KM_PROJECT_INFO_STATUS 表中选择一行。

然后我必须实现一个实现 DAO 的 Spring 服务。

因此,我首先创建一个名为 KMProjectInfoStatusService 的接口(interface),在其中声明我的 DAO 的方法:

public interface KMProjectInfoStatusService {

    @Transactional
    public List<KM_ProjectInfoStatus> getProjectInfoStatusList();

    @Transactional
    public KM_ProjectInfoStatus getProjectInfoStatus(Long idProjectInfoStatus);
}

我在 Hibernate 和 Spring 开发方面绝对是新手,我有以下问题

我有一个名为 KM_ProjectInfoStatus 的实体类,它映射一个名为 KM_PROJECT_INFO_STATUS 的数据库表,所以我有这个类:

package egp.prc.km.model;

import javax.persistence.*;
import java.io.Serializable;

@NamedQueries({
        @NamedQuery(name = "kmProjectInfoStatusList", query = "select status from KM_PROJECT_INFO_STATUS status order by status.name") ,
        @NamedQuery(name = "kmProjectInfoStatusById", query = "SELECT status  FROM KM_PROJECT_INFO_STATUS status  where lower(status.idProjectInfoStatus) = :statusId")
})

@Entity
@Table(name = "KM_PROJECT_INFO_STATUS")
public class KM_ProjectInfoStatus implements Serializable {

    @Id
    @GeneratedValue
    private Long idProjectInfoStatus;

    @Column(name = "foldertech")
    private Long foldertech;

    @Column(name = "folderproject")
    private Long folderproject;

    public Long getIdProjectInfoStatus() {
        return idProjectInfoStatus;
    }

    public void setIdProjectInfoStatus(Long idProjectInfoStatus) {
        this.idProjectInfoStatus = idProjectInfoStatus;
    }

    public Long getFoldertech() {
        return foldertech;
    }

    public void setFoldertech(Long foldertech) {
        this.foldertech = foldertech;
    }

    public Long getFolderproject() {
        return folderproject;
    }

    public void setFolderproject(Long folderproject) {
        this.folderproject = folderproject;
    }
}

正如您在前面的代码片段中看到的,该类还包含 2 个命名查询,这些是:

@NamedQueries({
        @NamedQuery(name = "kmProjectInfoStatusList", query = "select status from KM_PROJECT_INFO_STATUS status order by status.name") ,
        @NamedQuery(name = "kmProjectInfoStatusById", query = "SELECT status  FROM KM_PROJECT_INFO_STATUS status  where lower(status.idProjectInfoStatus) = :statusId")
})

然后我必须实现一个实现 DAO 的 Spring 服务。

因此,我首先创建一个名为 KMProjectInfoStatusService 的接口(interface),在其中声明 DAO 的方法:

公共(public)接口(interface) KMProjectInfoStatusService {

@Transactional
public List<KM_ProjectInfoStatus> getProjectInfoStatusList();

@Transactional
public KM_ProjectInfoStatus getProjectInfoStatus(Long idProjectInfoStatus);

}

最后,我创建了 KMProjectInfoStatusServiceImp 类来实现之前的接口(interface)并代表我的具体 DAO:

@Repository("kmProjectInfoStatusService")
public class KMProjectInfoStatusServiceImpl extends AbstractService implements KMProjectInfoStatusService {

    public List<KM_ProjectInfoStatus> getProjectInfoStatusList() {
        //return new KM_ProjectInfoStatus[0];  //To change body of implemented methods use File | Settings | File Templates.

        return getHibernateTemplate().execute(
                new HibernateCallback<List<KM_ProjectInfoStatus>>() {
                    public List<KM_ProjectInfoStatus> doInHibernate(Session session) throws HibernateException, SQLException {
                        return getStatusList(session);
                    }
                }
        );
    }


    public KM_ProjectInfoStatus getProjectInfoStatus(Long idProjectInfoStatus) {
        //return null;  //To change body of implemented methods use File | Settings | File Templates.

        final Long id = idProjectInfoStatus;
        return getHibernateTemplate().execute(
                new HibernateCallback<KM_ProjectInfoStatus>() {
                    public KM_ProjectInfoStatus doInHibernate(Session session) throws HibernateException, SQLException {
                        return getStatus(id, session);
                    }
                }
        );
    }

    private List<KM_ProjectInfoStatus> getStatusList(Session session) {
        //create query:
        Query query = session.getNamedQuery("kmProjectInfoStatusList");
        List<KM_ProjectInfoStatus> statusList =  query.list();

        return statusList;
    }

    private KM_ProjectInfoStatus getStatus(Long idProjectInfoStatus, Session session) {
        //create query:
        Query query = session.getNamedQuery("kmProjectInfoStatusById");
        query.setParameter("statusId", idProjectInfoStatus);

        KM_ProjectInfoStatus status = (KM_ProjectInfoStatus) query.uniqueResult();

        return status;
    }
}

正如您在此类中看到的,我实现了接口(interface)中声明的 2 个方法 getProjectInfoStatusList()getProjectInfoStatus()。这两个方法分别使用 getStatusList() 执行第一个命名查询以获取列表,并使用 getStatus() 执行第二个查询以从其 id 获取对象。

问题是,当我尝试执行我的项目时,会抛出 HibernateException ,并且我在堆栈跟踪中收到以下错误消息:

2014-12-29 16:25:44,210 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR impl.SessionFactoryImpl.<init>(363) - Error in named query: kmProjectInfoStatusById
org.hibernate.hql.ast.QuerySyntaxException: KM_PROJECT_INFO_STATUS is not mapped [SELECT status  FROM KM_PROJECT_INFO_STATUS status  where lower(status.idProjectInfoStatus) = :statusId]
    at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
    at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
    at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
    at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
    ................................................................................
    ................................................................................
    ................................................................................
    ................................................................................
<29-dic-2014 16.25.44 CET> <Error> <Deployer> <BEA-149202> <Encountered an exception while attempting to commit the 1 task for the application 'KM_Web_war_exploded'.> 
<29-dic-2014 16.25.44 CET> <Warning> <Deployer> <BEA-149004> <Failures were detected while initiating deploy task for application 'KM_Web_war_exploded'.> 
<29-dic-2014 16.25.44 CET> <Warning> <Deployer> <BEA-149078> <Stack trace for message 149004
weblogic.application.ModuleException: :org.hibernate.HibernateException:Errors in named queries: kmProjectInfoStatusById, kmProjectInfoStatusList
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:365)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
    Truncated. see log file for complete stacktrace
为什么?可能是什么问题呢?我缺少什么?我该如何解决这个问题?

最佳答案

您在 Hibernate 世界中,因此您需要使用 Hibernate 实体名称,而不再是 SQL 表名称。默认情况下,实体名称是类的简单名称。

所以你应该这样写:

select status from KM_ProjectInfoStatus status order by status.name

Google 有关 HQL/JPQL 的详细信息。

关于java - 为什么我在这个 Spring 项目中获得与命名查询相关的 HibernateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27691699/

相关文章:

java - Java 中使用 JFrame 的监听器

java - 如何显示 float 菜单图标?

sql - 如何从字符串中获取部分字符串

spring 配置服务器不刷新属性

java - 重构庞大的类时如何使用 Spring

java - 处理 XML 时发生错误“无法从位置加载架构映射

java - 有没有办法在 OSX Lion 上使用 Java 6 重新启用 javaws?

java - 用 cxf 覆盖 http 状态

sql - 如何从 SQL Server 2012 表中删除或更改 dbo 前缀?

SQL 查询 : Fetch ordered rows from a table - II