【问题标题】:hibernate throws NullPointerException when calling query.list methodhibernate 在调用 query.list 方法时抛出 NullPointerException
【发布时间】:2019-04-05 13:43:26
【问题描述】:

我试图通过使用休眠运行查询从我的数据库中获取一些数据。然后使用 query.list 方法将数据存储在 List 中。问题是我在运行 query.list 方法时遇到了 nullPointerException,我认为这是因为查询没有返回任何列表数据。

这是产生异常的方法

public static void getDataForMonth(int yearCount ,int monthCount){
        try {
            session.beginTransaction();
            LocalDate date = LocalDate.of(yearCount, monthCount, 1);

            Query query = session.createQuery("select t from Task t where month(t.date) = month(:date)  and year(t.date) = year(:date)");

            query.setParameter("date", dtf.format(date));
            taskList = query.list();
            session.getTransaction().commit();

            } finally {
            session.close();
        }
    }

这是日志:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
    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:564)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)
    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:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class tadej.Main
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:963)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
    at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:875)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
    ... 1 more
Caused by: java.lang.NullPointerException
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitGenericFunction(BaseSqmToSqlAstConverter.java:1184)
    at org.hibernate.query.sqm.tree.expression.function.SqmGenericFunction.accept(SqmGenericFunction.java:49)
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitRelationalPredicate(BaseSqmToSqlAstConverter.java:1774)
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitRelationalPredicate(BaseSqmToSqlAstConverter.java:213)
    at org.hibernate.query.sqm.tree.predicate.RelationalSqmPredicate.accept(RelationalSqmPredicate.java:72)
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitAndPredicate(BaseSqmToSqlAstConverter.java:1752)
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitAndPredicate(BaseSqmToSqlAstConverter.java:213)
    at org.hibernate.query.sqm.tree.predicate.AndSqmPredicate.accept(AndSqmPredicate.java:33)
    at org.hibernate.query.sqm.consume.spi.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:417)
    at org.hibernate.sql.ast.produce.sqm.spi.SqmSelectToSqlAstConverter.visitSelectStatement(SqmSelectToSqlAstConverter.java:189)
    at org.hibernate.sql.ast.produce.sqm.spi.SqmSelectToSqlAstConverter.interpret(SqmSelectToSqlAstConverter.java:113)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:162)
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:275)
    at org.hibernate.query.internal.AbstractQuery.list(AbstractQuery.java:1302)
    at tadej.TaskManager.<init>(TaskManager.java:129)
    at tadej.ChartPanel.sortDataByDay(ChartPanel.java:47)
    at tadej.ChartPanel.<init>(ChartPanel.java:31)
    at tadej.PanelManager.<init>(PanelManager.java:12)
    at tadej.Main.<init>(Main.java:10)
    ... 13 more
Exception running application tadej.Main

我有一堆类似的方法,它们的工作原理相同,但查询不同,它们工作得很好。

例如:

public static void getDataByDescriptionAndDate(String description, String date) {
        try {
            session.beginTransaction();

            Query query = session.createQuery("select c.id, c.description, c.completion, c.date from Task c where c.description = :desc and c.date = :dt");

            query.setParameter("desc", description).setParameter("dt", date);
            taskList = query.list();
            session.getTransaction().commit();

        } finally {
            Main.getFactory().getCurrentSession().close();
        }
    }

我尝试以字符串格式传递日期参数,但出现了同样的问题,我也在 MySQL 工作台中尝试过查询,它工作得很好,所以我真的很困惑为什么它在程序中不起作用。我坚持使用这个查询,因为它是我发现的唯一一个会根据从日期参数收集的月份和年份返回数据的查询,如果有人知道一个查询也会返回我需要的数据,请告诉我。

【问题讨论】:

  • 从任务 t 中选择 t 听起来不太好,尝试为任务表使用不同的别名
  • @NickAth 为什么听起来不太好,您认为我应该使用什么其他别名?它在我的所有其他查询中都有效,所以我看不出它在这个查询中不适用的原因。
  • 试试这个查询 query = session.createQuery("from Task t where month(t.date) = month(:date) and year(t.date) = year(:date)");
  • @NickAth 不起作用,同样的错误。

标签: java sql hibernate hql


【解决方案1】:

问题解决了。显然最新版本的hibernate不支持month()和year()函数,所以我将不得不从从数据库中获取的所有数据列表中选择java中所需的数据,或者使用不同的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多