Java 使用spring引导和spring数据JPA的CriteriaQuery中出现空指针异常

Java 使用spring引导和spring数据JPA的CriteriaQuery中出现空指针异常,java,spring,spring-boot,jpa,criteria-api,Java,Spring,Spring Boot,Jpa,Criteria Api,我正在尝试使用CriteriaQuery和spring引导以及spring数据JPA实现CriteriaAPI的一个示例。当我运行项目时,我得到了错误Null指针异常 错误 java.lang.NullPointerException: null at com.spacestudy.controller.AuthenticationController.load(AuthenticationController.java:57) ~[classes/:na] at sun.reflect.Nat

我正在尝试使用CriteriaQuery和spring引导以及spring数据JPA实现CriteriaAPI的一个示例。当我运行项目时,我得到了错误Null指针异常

错误

java.lang.NullPointerException: null
at com.spacestudy.controller.AuthenticationController.load(AuthenticationController.java:57) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_161]
我的控制器的测试代码是

@GetMapping("/load")
    public void load() {

        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Permissions> cq = cb.createQuery(Permissions.class);
        Root<Permissions> rPermission = cq.from(Permissions.class);
        cq.select(rPermission);
        cq.where(cb.equal(rPermission.get("nuserId"),730));    
        List<Permissions> results = em.createQuery(cq).getResultList();
        for (Permissions permission : results) {
            System.out.println("Number = " + permission.getSpermissionType());
        }
    }

我不熟悉这个标准API。有人能帮我解决这个问题吗?

EntityManager应该是@PersistenceContext

@PersistenceContext–我们需要了解如何使用简单的注释@PersistenceContext连接数据库,以及它是什么

 @PersistenceContext
 private EntityManager emf;

 @GetMapping("/load")
 public void load() {
    CriteriaBuilder cb = emf.getCriteriaBuilder();
    CriteriaQuery<Permissions> cq = cb.createQuery(Permissions.class);
    Root<Permissions> rPermission = cq.from(Permissions.class);
    cq.select(rPermission);
    cq.where(cb.equal(rPermission.get("nuserId"),730));    
    List<Permissions> results = em.createQuery(cq).getResultList();
    for (Permissions permission : results) {
        System.out.println("Number = " + permission.getSpermissionType());
    }
}
@PersistenceContext
私有实体管理器emf;
@GetMapping(“/load”)
公共空荷载(){
CriteriaBuilder cb=emf.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Permissions.class);
根权限=cq.from(Permissions.class);
cq.select(rPermission);
cq.式中(cb.equal(rPermission.get(“nuserId”),730));
List results=em.createQuery(cq.getResultList();
用于(权限:结果){
System.out.println(“Number=“+permission.getSubmissionType());
}
}

可能重复的第57行?EntityManager应为@Autowired@Manasi,第57行-EntityManager em=emf.createEntityManager();似乎您的emf为空,正如Ozgur建议您应该自动连接EntityManager。我添加了,但我在文件[C:\spacestudy\U workstation\SpaceStudySecurityService\target\classes\com\spacestudy\controller\AuthenticationController.class]中定义了:合并bean定义的后处理失败;嵌套异常为java.lang.IllegalStateException:静态数据库不支持持久性注释fields@PersistenceContext私有静态实体管理器工厂emf;-这是我在控制器中最上面的代码,现在我明白了问题所在。它现在起作用了。我能够获取样本输出。感谢您的回复和指导。这对我帮助很大。@ozgur您的代码块可读性差,将来很难重用。你能让它更具可读性,从而对其他开发者产生更好的影响吗?您可以这样做:添加一些空行,分隔代码的不同部分,并为变量使用更好的名称,以便将来使用时更具可读性。谢谢:)
 @PersistenceContext
 private EntityManager emf;

 @GetMapping("/load")
 public void load() {
    CriteriaBuilder cb = emf.getCriteriaBuilder();
    CriteriaQuery<Permissions> cq = cb.createQuery(Permissions.class);
    Root<Permissions> rPermission = cq.from(Permissions.class);
    cq.select(rPermission);
    cq.where(cb.equal(rPermission.get("nuserId"),730));    
    List<Permissions> results = em.createQuery(cq).getResultList();
    for (Permissions permission : results) {
        System.out.println("Number = " + permission.getSpermissionType());
    }
}