命名查询未知:findById

Posted

技术标签:

【中文标题】命名查询未知:findById【英文标题】:Named query not known: findById 【发布时间】:2014-08-25 14:31:15 【问题描述】:

我正在尝试构建这个简单的项目,但我不断收到同样的错误。谁能帮忙解决一下?

HibernateTest.java

public class HibernateTest

    public static void main(String[] args) 
    
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        UserDetails user = new UserDetails();

        Query query = session.getNamedQuery("findById");

        List<?> list = query.list();
        if (!list.isEmpty())
         UserDetails userD = (UserDetails) list.get(0);
          System.out.println(userD); 
     

UserDetails.java

package com;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table (name="UserDetails")
@NamedQuery(
        name = "findById",
        query = "SELECT x FROM UserDetails x WHERE x.id = '3'")
public class UserDetails

    @Id
    @Column(name="UserID")
    private int id;
    @Column(name="UserName")
    private String name;

    public void setId(int id)
     this.id = id; 
    public int getId()
     return id; 

    public void setName(String name) 
     this.name = name; 
    public String getName()
     return name; 

我不确定出了什么问题,因为我在不同的项目中运行了相同的查询并且它运行良好。

【问题讨论】:

您是否已验证您的 Hibernate 配置知道 UserDetails 类? 我的 hibernate.cfg.xml 中有这个 所以...您使用的是 XML 映射而不是注释驱动的映射?!那么命名查询是否存在于您的userdetails.hbm.xml 中? 我没有。我怎么把它放进去? 【参考方案1】:

我遇到了同样的问题,我通过在applicationContext.xml 中添加以下内容解决了这个问题。

<property name="annotatedClasses">  
              <list>
               <value>com.Employee</value>
               </list>  
               </property>

【讨论】:

【参考方案2】:

如果您使用 XML 配置,则可以使用 &lt;query&gt; 标记定义命名查询。例如:

<query name = "findById">
    <![CDATA[SELECT x FROM UserDetails x WHERE x.id = '3']]>
</query>

&lt;query&gt; 标记与&lt;class&gt; 标记处于同一级别,作为&lt;hibernate-mapping&gt; 标记的子级。

【讨论】:

【参考方案3】:

虽然这不能解决您的直接问题,但如果您使用的是 Hibernate 和 JPA 注释,为什么不使用 EntityManager 代替 Hibernate 会话和其他东西?

使用 Persistence Unit(以及您的 META-INF 文件夹中的 persistence.xml),您可以这样做:

EntityManagerFactory emf = 
Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery("findById");

或者更好:

TypedQuery<UserDetails> query = em.createNamedQuery("findById", UserDetails.class);

方法大致相同(毕竟JPA是用Hibernate做的)。

【讨论】:

以上是关于命名查询未知:findById的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.MappingException 命名查询未知

为啥不能修改 Mongoose 查询返回的数据(例如:findById)

Mongoose:查询未完成时如何findById

Mongoose:查询未完成时如何findById

spring data jpa使用repository进行查询,使用userRepository.getOne(id)和userRepository.findById(id)无法从数据库查询到数据

springdataJpa