我收到了以下代码
@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
虽然我在另一个项目中使用了这个命名查询,并且它有效,但这里可能出现什么问题?
答案 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
之后,好