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

问题描述 投票:0回答:5

我得到了以下代码

@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

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

java jpa ejb-3.0 entitymanager
5个回答
16
投票

使用

em.createQuery(...
代替 em.createNamedQuery()

如果您使用命名查询(我推荐),您必须将查询放置在实体类的 @NamedQuery 注释中。


6
投票

在 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 {

    ....
}

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

Query q =em.createNamedQuery("Bondecommande.findByIdbc");

如果您使用的是 JPA 2.x,我建议使用

TypedQuery<T>
而不是
Query


1
投票

createNamedQuery()
采用查询名称,而不是查询本身。

查询可以通过注释来定义

@NamedQuery
看看这个: http://docs.oracle.com/javaee/6/api/javax/persistence/NamedQuery.html


0
投票

当我将工作代码从 Java 8 迁移到 17(以及 11)时,我遇到了类似的错误。我正在使用 EclipseLink (2.5)。

修复方法是将 EclipseLink 升级到 2.7,然后它又可以工作了。


-3
投票
Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");

em.createQuery
之后,很好

© www.soinside.com 2019 - 2024. All rights reserved.