java.lang.IllegalArgumentException:找不到命名查询:

时间:2013-12-10 15:02:11

标签: java jpa ejb-3.0 entitymanager

我收到了以下代码

@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

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

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:5)

在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 {

    ....
}

您可以通过将查询名称传递给create method来使用命名查询:

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
em.createQuery之后

,好