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

Bel*_*uel 4 java jpa entitymanager ejb-3.0

我得到了以下代码

@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);
     }
}
Run Code Online (Sandbox Code Playgroud)

@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 
}
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalArgumentException异常:命名查询未找到:从Bondecommande选择公元前其中bc.idbc =:IDBC

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

小智 14

使用em.createQuery(...而不是em.createNamedQuery()

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


Fly*_*ing 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 {

    ....
}
Run Code Online (Sandbox Code Playgroud)

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

Query q =em.createNamedQuery("Bondecommande.findByIdbc");
Run Code Online (Sandbox Code Playgroud)

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