hibernate 在调用 query.list 方法时抛出 NullPointerException
hibernate throws NullPointerException when calling query.list method
我正在尝试通过 运行 使用休眠的查询从我的数据库中获取一些数据。然后使用 query.list 方法将数据存储在列表中。问题是我在 运行 query.list 方法时收到 nullPointerException,我认为这是因为查询没有 return 任何列表数据。
这是产生异常的方法
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(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(LauncherImpl.java:875)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(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(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 workbench 中的查询并且它工作得很好,所以我真的很困惑为什么它在程序中不起作用。我坚持使用这个查询,因为它是我发现的唯一一个 return 从日期参数收集的基于月份和年份的数据,如果有人知道一个查询也会 return 我我需要的数据请告诉我。
问题已解决。显然最新版本的 hibernate 不支持 month() 和 year() 函数,所以我将不得不从数据库中获取的所有数据列表中 select java 中的所需数据,或者使用不同的查询。
我正在尝试通过 运行 使用休眠的查询从我的数据库中获取一些数据。然后使用 query.list 方法将数据存储在列表中。问题是我在 运行 query.list 方法时收到 nullPointerException,我认为这是因为查询没有 return 任何列表数据。
这是产生异常的方法
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(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(LauncherImpl.java:875)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:449)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:418)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(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(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 workbench 中的查询并且它工作得很好,所以我真的很困惑为什么它在程序中不起作用。我坚持使用这个查询,因为它是我发现的唯一一个 return 从日期参数收集的基于月份和年份的数据,如果有人知道一个查询也会 return 我我需要的数据请告诉我。
问题已解决。显然最新版本的 hibernate 不支持 month() 和 year() 函数,所以我将不得不从数据库中获取的所有数据列表中 select java 中的所需数据,或者使用不同的查询。