2013-12-10 117 views
3

我得到了下面的代码:BondecomandeDAO.javajava.lang.IllegalArgumentException异常:未找到命名查询:

@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); 
    } 
} 

而且Bondecommande.java类

@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:命名的查询未找到:从bdedecmande bc选择bc其中bc。 IDBC =:IDBC

虽然我在另一个项目中使用了这个命名查询,但它的工作原理是什么?提前致谢!

回答

13

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

如果你有一个名为查询的工作(我会建议),你必须把一个@NamedQuery注释内部的查询您的实体类。

5

在JPA查询和命名查询是不一样的东西。

命名查询有“名”,你通过你的实体类型类中添加@NamedQueries注释定义它们:

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

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

    .... 
} 

这可以通过使用查询的名称创建方法使用命名查询

我建议使用TypedQuery<T>Query如果你正在使用JPA 2.x的

-1
Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc"); 

此处em.createQuery之后,还好

相关问题