英文:
How to get objects from data base with fields marked LAZY
问题
在DAO层中,我对方法findAll()遇到了一些问题。最终它能够正确地获取所有的对象,但在处理过程中出现了一些与“null”有关的错误。
例如,类Group有一个字段Faculty,Faculty是一个POJO:
@Entity
@Table(name = "groups")
public class Group implements ModelEntity {
@Id
@Column(name = "group_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groups_seq")
@SequenceGenerator(name = "groups_seq", sequenceName = "groups_group_id_seq", allocationSize = 1)
private int id;
@Column(name = "group_name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "faculty_id")
private Faculty faculty;
}
以下是dao中的findAll()方法:
@SuppressWarnings("unchecked")
public List<T> findAll() {
logger.debug("findAll()");
EntityManager entityManager = entityManagerFactory.createEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = (CriteriaQuery<T>) criteriaBuilder.createQuery(getEntityClass());
Root<T> rootEntry = (Root<T>) criteriaQuery.from(getEntityClass());
CriteriaQuery<T> all = criteriaQuery.select(rootEntry);
TypedQuery<T> allQuery = entityManager.createQuery(all);
List<T> result = allQuery.getResultList();
logger.trace("findAll() found {} entries.", result.size());
return result;
}
当我访问网站的/groups/getAll页面时,浏览器会在各自的列中显示所有的组和院系,一切正常。但在控制台中,我看到了从List<T> result = allQuery.getResultList();
开始的java.lang.NullPointerException: null
错误。当我选择FetchType.EAGER时,情况也是相同的,所有的记录都在这里,但控制台中出现了NPE错误。
如何解决控制台中的NPE错误?
日志看起来像这样:
java.lang.NullPointerException: null
at org.hibernate.sql.ast.SqlTreePrinter.lambda$visitQuerySpec$18(SqlTreePrinter.java:262)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:201)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:190)
...
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
(代码部分已被翻译,如有需要,你可以自行检查翻译的准确性。)
英文:
I have some problem with method findAll() in DAO layer. Finally it gets all object correctly, but have some error with "null" in process.
For example, class Group has field Faculty, Faculty is POJO:
@Entity
@Table(name = "groups")
public class Group implements ModelEntity {
@Id
@Column(name = "group_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groups_seq")
@SequenceGenerator(name = "groups_seq", sequenceName = "groups_group_id_seq", allocationSize = 1)
private int id;
@Column(name = "group_name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "faculty_id")
private Faculty faculty;
here is findAll() in dao:
@SuppressWarnings("unchecked")
public List<T> findAll() {
logger.debug("findAll()");
EntityManager entityManager = entityManagerFactory.createEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = (CriteriaQuery<T>) criteriaBuilder.createQuery(getEntityClass());
Root<T> rootEntry = (Root<T>) criteriaQuery.from(getEntityClass());
CriteriaQuery<T> all = criteriaQuery.select(rootEntry);
TypedQuery<T> allQuery = entityManager.createQuery(all);
List<T> result = allQuery.getResultList();
logger.trace("findAll() found {} entries.", result.size());
return result;
}
When I go on site to /groups/getAll browser displays all groups and faculties in their columns, all OK, but in console I see java.lang.NullPointerException: null
which start from List<T> result = allQuery.getResultList();
when I choose FetchType.EAGER the same situation- all records here, but NPE in console.
How to beat NPE in console?
logs look like:
java.lang.NullPointerException: null
at org.hibernate.sql.ast.SqlTreePrinter.lambda$visitQuerySpec$18(SqlTreePrinter.java:262)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:201)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:190)
at org.hibernate.sql.ast.SqlTreePrinter.visitQuerySpec(SqlTreePrinter.java:246)
at org.hibernate.sql.ast.SqlTreePrinter.lambda$visitStatement$0(SqlTreePrinter.java:90)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:201)
at org.hibernate.sql.ast.SqlTreePrinter.logNode(SqlTreePrinter.java:190)
at org.hibernate.sql.ast.SqlTreePrinter.visitStatement(SqlTreePrinter.java:88)
at org.hibernate.sql.ast.SqlTreePrinter.print(SqlTreePrinter.java:75)
at org.hibernate.sql.ast.spi.StandardSqlAstSelectTranslator.translate(StandardSqlAstSelectTranslator.java:85)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:232)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.resolveCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:193)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:153)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:437)
at org.hibernate.query.spi.AbstractQuery.list(AbstractQuery.java:1356)
at org.hibernate.query.Query.getResultList(Query.java:136)
at com.rumakin.universityschedule.dao.Dao.findAll(Dao.java:71)
at com.rumakin.universityschedule.service.AuditoriumService.findAll(AuditoriumService.java:35)
at com.rumakin.universityschedule.controllers.AuditoriumController.findAll(AuditoriumController.java:37)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
03:21:08.012 [http-nio-8080-exec-12] DEBUG org.hibernate.orm.sql.ast.tree -
SQL AST Tree:
-> [select-statement]
-> [query-spec]
-> [select]
selection - org.hibernate.sql.results.internal.SqlSelectionImpl@d1311e6a
selection - org.hibernate.sql.results.internal.SqlSelectionImpl@429797b9
selection - org.hibernate.sql.results.internal.SqlSelectionImpl@78d44e89
selection - org.hibernate.sql.results.internal.SqlSelectionImpl@ea2bc8b8
<- [select]
-> [from]
-> [table-group]
-> [Auditorium as a1_0]
<- [table-group]
<- [from]
<- [query-spec]
<- [select-statement]
专注分享java语言的经验与见解,让所有开发者获益!
评论