2013-12-10 122 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之後,還好

相關問題