如何从数据库中获取带有标记为LAZY的字段的对象

huangapple 未分类评论49阅读模式
英文:

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 = &quot;groups&quot;)
public class Group implements ModelEntity {

    @Id
    @Column(name = &quot;group_id&quot;)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &quot;groups_seq&quot;)
    @SequenceGenerator(name = &quot;groups_seq&quot;, sequenceName = &quot;groups_group_id_seq&quot;, allocationSize = 1)
    private int id;
    
    @Column(name = &quot;group_name&quot;)
    private String name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = &quot;faculty_id&quot;)
    private Faculty faculty;

here is findAll() in dao:

 @SuppressWarnings(&quot;unchecked&quot;)
    public List&lt;T&gt; findAll() {
        logger.debug(&quot;findAll()&quot;);
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery&lt;T&gt; criteriaQuery = (CriteriaQuery&lt;T&gt;) criteriaBuilder.createQuery(getEntityClass());
        Root&lt;T&gt; rootEntry = (Root&lt;T&gt;) criteriaQuery.from(getEntityClass());
        CriteriaQuery&lt;T&gt; all = criteriaQuery.select(rootEntry);
        TypedQuery&lt;T&gt; allQuery = entityManager.createQuery(all);
        List&lt;T&gt; result = allQuery.getResultList();
        logger.trace(&quot;findAll() found {} entries.&quot;, 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&lt;T&gt; 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:
    -&gt; [select-statement]
      -&gt; [query-spec]
        -&gt; [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
        &lt;- [select]
        -&gt; [from]
          -&gt; [table-group]
            -&gt; [Auditorium as a1_0]
          &lt;- [table-group]
        &lt;- [from]
      &lt;- [query-spec]
    &lt;- [select-statement]

huangapple
  • 本文由 发表于 2020年5月5日 05:20:15
  • 转载请务必保留本文链接:https://java.coder-hub.com/61601819.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定