我得到了以下代码
@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:未找到命名查询:select bc from Bondecommande bc where bc.idbc =:idbc
虽然我在另一个项目中使用了这个命名查询,并且它工作正常,但是这里会有什么问题呢?
5条答案
按热度按时间zc0qhyus1#
使用
em.createQuery(...
而不是em.如果你使用命名查询(我推荐),你必须把查询放在实体类上的@NamedQuery注解中。
shstlldc2#
在JPA中,查询和命名查询不是一回事。
命名查询具有“名称”,您可以通过在实体类型类上添加
@NamedQueries
注解来定义它们:通过传递查询的名称来创建方法,可以使用命名查询:
如果您使用的是JPA 2.x,我建议使用
TypedQuery<T>
而不是Query
e4yzc0pl3#
createNamedQuery()
采用查询的名称,而不是查询本身。查询可以通过注解
@NamedQuery
来定义,看看这个:http://docs.oracle.com/javaee/6/api/javax/persistence/NamedQuery.htmll5tcr1uw4#
当我将Java 8的工作代码迁移到17(以及11)时,我也遇到了类似的错误。我用的是P2P(2.5)
修复方法是将ProsseLink升级到2.7,它再次工作。
jljoyd4f5#
在
em.createQuery
之后,好的