【问题标题】:java.lang.IllegalArgumentException: Named query not found:java.lang.IllegalArgumentException:未找到命名查询:
【发布时间】:2013-12-28 04:01:09
【问题描述】:

我得到以下代码

@Stateless
public class BondecomandeDAO {

    @PersistenceContext
    private EntityManager em;

    public Bondecommande findBCbyid(int id)
    {
         Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
         q.setParameter("idbc", id);
         return  (Bondecommande) q.getResultList().get(0);
     }
}

@Entity
@Table(name="bondecommande")
public class Bondecommande  implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="idbc")
    private int idbc;
    @Column(name="devise")
    private String devise;
    @Column(name="modepaiement")
    private String modepaiement;
    @Column(name="modelivraison")
    private String modelivraison;
    @Column(name="delaipaiement")
    private int delaipaiement;

      ////other attributes , getters and setters 
}

当我尝试运行函数 findBCbyid(int id) 时,我收到此错误

java.lang.IllegalArgumentException:未找到命名查询:从 Bondecommande bc 中选择 bc,其中 bc.idbc = :idbc

虽然我在另一个项目中使用了这个命名查询,并且它有效,但这里可能有什么问题?

【问题讨论】:

    标签: java jpa ejb-3.0 entitymanager


    【解决方案1】:

    使用em.createQuery(... 代替 em.createNamedQuery()

    如果您使用命名查询(我建议这样做),您必须将查询放在实体类的 @NamedQuery 注释中。

    【讨论】:

      【解决方案2】:

      在 JPA 中查询和命名查询不是一回事。

      命名查询具有“名称”,您可以通过在实体类型类上添加 @NamedQueries 注释来定义它们:

      @Entity
      @Table(name="bondecommande")
      @NamedQueries({
          @NamedQuery(name="Bondecommande.findByIdbc", query="select bc from Bondecommande bc where bc.idbc = :idbc"),
          @NamedQuery(name="...", query="..."),
      }) 
      public class Bondecommande  implements Serializable {
      
          ....
      }
      

      您通过将查询名称传递给创建方法来使用命名查询:

      Query q =em.createNamedQuery("Bondecommande.findByIdbc");
      

      如果您使用 JPA 2.x,我建议使用 TypedQuery<T> 而不是 Query

      【讨论】:

        【解决方案3】:

        createNamedQuery() 采用查询的名称,而不是查询本身。

        查询可以通过注解@NamedQuery来定义 看看这个: http://docs.oracle.com/javaee/6/api/javax/persistence/NamedQuery.html

        【讨论】:

          【解决方案4】:
          Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
          

          em.createQuery 之后,很好

          【讨论】:

            猜你喜欢
            • 2023-03-08
            • 2015-11-18
            • 2016-12-21
            • 1970-01-01
            • 2018-02-07
            • 2011-09-11
            相关资源
            最近更新 更多