Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalArgumentException:未找到命名查询:_Java_Jpa_Ejb 3.0_Entitymanager - Fatal编程技术网

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");