java.lang.IllegalArgumentException:未找到命名查询:
我得到了以下代码java.lang.IllegalArgumentException:未找到命名查询:,java,jpa,ejb-3.0,entitymanager,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"
@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);
}
}
及
当我尝试运行函数findBCbyid(int-id)
时,我得到了这个错误
java.lang.IllegalArgumentException:未找到命名查询:从Bondecommande bc中选择bc,其中bc.idbc=:idbc
虽然我在另一个项目中使用了这个命名查询,并且它起了作用,但这里会有什么问题?使用em.createQuery(…
而不是em.createNamedQuery()
如果使用命名查询(我建议使用),则必须将查询放置在实体类的@NamedQuery注释中。createNamedQuery()
采用查询的名称,而不是查询本身
查询可以通过注释@NamedQuery
看看这个:
在JPA查询和命名查询中是不同的 命名查询具有“名称”,您可以通过在实体类型类上添加
@namedquerys
注释来定义它们:
@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");
如果您使用的是JPA2.x,我建议您使用TypedQuery
而不是Query
Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
在这里em.createQuery
之后,很好
Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");