gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:20:51 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com