Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
针对多通的Sql jpa查询_Jpa_Nullpointerexception_Ejb_Isqlquery - Fatal编程技术网

针对多通的Sql jpa查询

针对多通的Sql jpa查询,jpa,nullpointerexception,ejb,isqlquery,Jpa,Nullpointerexception,Ejb,Isqlquery,对不起,我的英语不好,这可能是个糟糕的问题。我有这个: 实体 你能帮我吗?谢谢大家 你使用了一种不好的做法,通过使用它,你会直接受到影响。返回列表(或任何类型的集合)的方法不应返回null。如果没有要返回的内容,它应该返回一个空列表。通过返回null,您可以强制每个调用方(包括您自己)在使用返回的列表之前始终检查null,但您没有这样做: List<BooksEntity> books = this.getAllBooks(); if (books.isEmpty()) {

对不起,我的英语不好,这可能是个糟糕的问题。我有这个:

实体

你能帮我吗?谢谢大家


你使用了一种不好的做法,通过使用它,你会直接受到影响。返回列表(或任何类型的集合)的方法不应返回null。如果没有要返回的内容,它应该返回一个空列表。通过返回null,您可以强制每个调用方(包括您自己)在使用返回的列表之前始终检查null,但您没有这样做:

List<BooksEntity> books = this.getAllBooks();
if (books.isEmpty()) {
    return null;
}
请注意,代码要短得多,并且没有引发NullPointerException的风险

这就是说,您为给定用户名查找书籍的方法效率极低:您正在加载每一本书(想象一下使用真正的图书馆这样做),而对于每一本书,您正在加载其所有用户

查找具有给定名称的所有用户(例如,使用
findByName
命名查询)并返回他们的书籍将更加高效。或者更好的方法是,在一个JPQL查询中完成这一切:

select book from UsersEntity user
inner join user.book book
where user.name = :name
然后,该方法将如下所示:

public List<BooksEntity> getAllBooksUser(String name) {
    String jpql = 
        "select book from UsersEntity user"
        + " inner join user.book book"
        + " where user.name = :name";
    return em.createTypedQuery(jpql, BooksEntity.class)
             .setParameter("name", name)
             .getResultList();
}
公共列表getAllBooksUser(字符串名称){
字符串jpql=
“从UsersEntity用户中选择书本”
+“内部加入user.book”
+“其中user.name=:name”;
返回em.createTypedQuery(jpql,BooksEntity.class)
.setParameter(“名称”,名称)
.getResultList();
}

最后,如果您将实体命名为
Book
User
,而不是
BooksEntity
UsersEntity
,那么代码的可读性会更高。对单个用户或书籍使用复数形式是一个非常糟糕的主意。而且
实体
后缀很烦人。

非常感谢,我只学了2个月的java,这是我的第一个项目/
    WARNING: EJB5184:A system exception occurred during an invocation on EJB BookManager, method: public java.util.List book.ejb.BookManager.getAllBooksUser(java.lang.String)
    WARNING: javax.ejb.EJBException
        at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215)
        at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89)
        at $Proxy230.getAllBooksUser(Unknown Source)
        at book.bean.BookEditBean.getUserBooks(BookEditBean.java:52)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
        at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
        at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
        at com.sun.el.parser.AstValue.getValue(AstValue.java:138)
        at com.sun.el.parser.AstValue.getValue(AstValue.java:183)
        at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
        at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
        at com.sun.faces.facelets.component.UIRepeat.getValue(UIRepeat.java:273)
        at com.sun.faces.facelets.component.UIRepeat.getDataModel(UIRepeat.java:249)
        at com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:443)
        at com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:482)
        at com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:984)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
        at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
        at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
        at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
        at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
        at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
        at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.NullPointerException
        at book.ejb.BookManager.getAllBooksUser(BookManager.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
        at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
        at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
        at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
        at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
        at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
        at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
        ... 61 more
List<BooksEntity> books = this.getAllBooks();
if (books.isEmpty()) {
    return null;
}
@Override
public List<BooksEntity> getAllBooks() {
    return em.createNamedQuery("BooksEntity.findAll").getResultList();
}

@Override
public List<BooksEntity> getAllBooksUser(String name) {
    List<BooksEntity> books = this.getAllBooks();
    List<BooksEntity> userbooks = new ArrayList<BooksEntity>();
    for (BooksEntity book : books) {
        users = book.getUsers();
        for (UsersEntity user : users) {
            if (name.equals(user.getName())) {
                userbooks.add(book);
            }
        }
    }
    return userBooks;
}
select book from UsersEntity user
inner join user.book book
where user.name = :name
public List<BooksEntity> getAllBooksUser(String name) {
    String jpql = 
        "select book from UsersEntity user"
        + " inner join user.book book"
        + " where user.name = :name";
    return em.createTypedQuery(jpql, BooksEntity.class)
             .setParameter("name", name)
             .getResultList();
}