【问题标题】:Named query not known: findById命名查询未知: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 中?
  • 我没有。我怎么把它放进去?

标签: java hibernate named-query


【解决方案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做的)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-22
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多