Hibernate异常之Integer转float(自动类型转换错误)

错误代码:

 1 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
 2     at org.hibernate.type.descriptor.java.FloatTypeDescriptor.unwrap(FloatTypeDescriptor.java:19)
 3     at org.hibernate.type.descriptor.sql.RealTypeDescriptor$1.doBind(RealTypeDescriptor.java:46)
 4     at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:74)
 5     at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
 6     at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
 7     at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:51)
 8     at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:628)
 9     at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2001)
10     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1915)
11     at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1893)
12     at org.hibernate.loader.Loader.doQuery(Loader.java:938)
13     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
14     at org.hibernate.loader.Loader.doList(Loader.java:2692)
15     at org.hibernate.loader.Loader.doList(Loader.java:2675)
16     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507)
17     at org.hibernate.loader.Loader.list(Loader.java:2502)
18     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
19     at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:392)
20     at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
21     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1489)
22     at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445)
23     at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414)
24     at pw.fengya.test.TestHibernate.testHQL(TestHibernate.java:84)
25     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
26     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
27     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
28     at java.lang.reflect.Method.invoke(Method.java:483)
29     at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
30     at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
31     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)
32     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$201/1771687225.execute(Unknown Source)
33     at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
34     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
35     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
36     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
37     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)
38     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$133/1144648478.execute(Unknown Source)
39     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
40     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
41     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
42     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$136/1681595665.accept(Unknown Source)
43     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
44     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
45     at java.util.Iterator.forEachRemaining(Iterator.java:116)
46     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
47     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
48     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
49     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
50     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
51     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
52     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
53     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
54     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$133/1144648478.execute(Unknown Source)
55     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
56     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
57     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
58     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$136/1681595665.accept(Unknown Source)
59     at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
60     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
61     at java.util.Iterator.forEachRemaining(Iterator.java:116)
62     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
63     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
64     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
65     at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
66     at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
67     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
68     at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
69     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
70     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$$Lambda$133/1144648478.execute(Unknown Source)
71     at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
72     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
73     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
74     at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
75     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
76     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
77     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
78     at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:86)
79     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
80     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
81     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
82     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
83     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

根据首行的异常信息可以得出,这个错误是由int转float类型错误,我的查询HQL语句如下:

 1 void testHQL() {
 2         String hql = "FROM Employee e where e.salary > ? AND e.dept = ? AND e.email like ?";
 3         Query<Employee> query = session.createQuery(hql);
 4         
 5         Deptartment dept = new Deptartment();
 6         dept.setId(5);
 7         //动态绑定参数
 8         query.setParameter(0, 6000)
 9              .setParameter(1, dept)
10              .setParameter(2,"%a%");
11         
12         List<Employee> emps = query.list();
13         System.out.println(emps.size());
14     } 

后来经过查找,发现salary是float类型,直接传入一个int整型参数,无法自动转换成float类型,可以先将int型参数转换为String 类型,再转换为float类型:

 1 void testHQL() {
 2         String hql = "FROM Employee e where e.salary > ? AND e.dept = ? AND e.email like ?";
 3         Query<Employee> query = session.createQuery(hql);
 4         
 5         Deptartment dept = new Deptartment();
 6         dept.setId(5);
 7         //动态绑定参数
 8         query.setParameter(0, Float.valueOf(6000))
 9              .setParameter(1, dept)
10              .setParameter(2,"%a%");
11         
12         List<Employee> emps = query.list();
13         System.out.println(emps.size());
14     } 
原文地址:https://www.cnblogs.com/lxc-2017/p/8553406.html