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

vohkndzv  于 8个月前  发布在  Java
关注(0)|答案(5)|浏览(83)

我得到了以下代码

@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
虽然我在另一个项目中使用了这个命名查询,并且它工作正常,但是这里会有什么问题呢?

zc0qhyus

zc0qhyus1#

使用em.createQuery(...而不是em.
如果你使用命名查询(我推荐),你必须把查询放在实体类上的@NamedQuery注解中。

shstlldc

shstlldc2#

在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

e4yzc0pl

e4yzc0pl3#

createNamedQuery()采用查询的名称,而不是查询本身。
查询可以通过注解@NamedQuery来定义,看看这个:http://docs.oracle.com/javaee/6/api/javax/persistence/NamedQuery.html

l5tcr1uw

l5tcr1uw4#

当我将Java 8的工作代码迁移到17(以及11)时,我也遇到了类似的错误。我用的是P2P(2.5)
修复方法是将ProsseLink升级到2.7,它再次工作。

jljoyd4f

jljoyd4f5#

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

em.createQuery之后,好的

相关问题