Spring 还不支持Hibernate纯本机标量查询
我正在进行一个多模式项目,遇到了一个令人沮丧的错误Spring 还不支持Hibernate纯本机标量查询,spring,spring-boot,hibernate,spring-data-jpa,Spring,Spring Boot,Hibernate,Spring Data Jpa,我正在进行一个多模式项目,遇到了一个令人沮丧的错误 I get org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported Caused by: org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported at
I get org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
Caused by: org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
at org.hibernate.cfg.annotations.QueryBinder.bindNativeQuery(QueryBinder.java:206) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.cfg.AnnotationBinder.bindQueries(AnnotationBinder.java:408) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:580) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:248) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:230) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:273) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.1.jar!/:5.3.1]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.1.jar!/:5.3.1]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.1.jar!/:5.3.1]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
无论我尝试执行什么-本机查询、本机命名查询、查询、命名查询。。。总是
同样的错误
我做错了什么
单元A:
具有Spring组件和Hibernate实体类
模块B:
是一个导入模块a的SpringBoot项目
模块A pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.moduleA</groupId>
<artifactId>A</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<jaxb-and-jaxws-lib.version>2.3.3</jaxb-and-jaxws-lib.version>
<logging.version>2.13.3</logging.version>
<junit-jupiter-api.version>5.7.0</junit-jupiter-api.version>
<junit-jupiter-params.version>5.7.0</junit-jupiter-params.version>
<mockito-junit-jupiter.version>3.5.10</mockito-junit-jupiter.version>
<cxf-xjc-plugin.version>3.3.1</cxf-xjc-plugin.version>
<maven.compiler.plugin>3.8.1</maven.compiler.plugin>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<hibernate-core.version>5.4.23.Final</hibernate-core.version>
<hibernate-commons-annotations.version>5.1.2.Final</hibernate-commons-annotations.version>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate-core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
</plugins>
</build>
</project>
当我尝试执行这个类时
package com.moduleB.pxs.dao;
import org.hibernate.query.NativeQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManager;
import javax.persistence.Tuple;
import java.sql.Date;
import java.time.LocalDateTime;
import java.util.List;
@Component
public class TestDaoImpl implements TestDao {
@Autowired
private EntityManager em;
@Autowired
private TestTransformer testTransformer;
public List<TestDto> getTestDto() {
List<Test> tuples = em.createNamedQuery("Test.doTest",
Tuple.class);
return testTransformer.transform(tuples);
}
}
其他信息:
AbstractEntityManagerFactoryBean.java上的断点:516行
Object retVal = method.invoke(getNativeEntityManagerFactory(), args);
是引发此错误的执行点
第1次更新
试图执行
getNativeEntityManagerFactory().getMetamodel().getEntities()
来自AbstractEntityManagerFactoryBean.java:516行
Object retVal = method.invoke(getNativeEntityManagerFactory(), args);
给予
第2次更新
试图调用
em.getMetamodel().getEntities()
给出了相同的错误
第3次更新
最令人惊讶同时也是最令人沮丧的时刻是
如果我把实体类移到Springboot项目中
工作
第4次更新
这个错误似乎与将实体类放入不同的项目有关
第5次更新
此错误的确切位置发生在
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.java 1255行
final SessionFactoryBuilder sfBuilder = metadata().getSessionFactoryBuilder();
正在尝试执行method metadata(),但是spring boot会接受此错误
和靴子没有问题。。。片刻之后,当尝试使用entityManager时
它出现了
第6次更新
找到罪犯
类:org.hibernate.cfg.annotations.QueryBinder.java
方法:公共静态void bindinativequery
线路:206
hibernate似乎需要知道resultClass,否则会抛出此错误
第7次更新
所以,我想我找到了它抛出这个错误的原因。。。感觉像是一只虫子
弹簧靴的侧面,等等
当您的实体位于主类上的主项目(spring boot)中的一个单独项目中时,您必须像
@EntityScan(basePackageClasses={myEntityFromOtherProject.class})
,
然而,它似乎背后的功能
@实体扫描
皈依
@javax.persistence.NamedNativeRequesty
到
@org.hibernate.annotations.namedNativeRequesty
并且发生了第6次更新中描述的情况
但是,当注释
@实体扫描
未使用,并且实体类与spring boot项目位于同一项目中
然后就不会发生这种转换,hibernate只执行指定的代码
添加到注释
javax.persistence.NamedNativeRequesty
定义在
类:org.hibernate.cfg.AnnotationBinder.java
电话号码:411
所以,我想这是一只虫子。。。从Spring Boot的角度来看。看起来您使用的Hibernate版本非常旧。我看到您指定了一个版本,但我猜该版本被其他依赖项覆盖。看起来您使用的Hibernate版本非常旧。我看到您指定了一个版本,但我猜该版本被其他依赖项覆盖。因此,经过长时间的调试会话后,我得出结论,我意外地 混合两种注释 即 @javax.persistence.NamedNativeRequesty 及 @org.hibernate.annotations.namedNativeRequesty 移除 @org.hibernate.annotations.namedNativeRequesty
修复了这个问题,所以在一次长时间的调试之后,我得出了一个结论,我无意中 混合两种注释 即 @javax.persistence.NamedNativeRequesty 及 @org.hibernate.annotations.namedNativeRequesty 移除 @org.hibernate.annotations.namedNativeRequesty
修复了问题是this:还是this:帮助?感谢您的回复,我在发布到stackoverflow之前尝试了您提供的解决方案,但它们对我不起作用,无论sql返回什么(1列结果或4列结果)都是相同的错误是this:还是this:帮助?感谢您的回复,在发布到stackoverflow之前,我已经尝试了您提供的解决方案,但它们对我不起作用,无论sql返回什么结果(1列结果或4列结果),都是相同的错误谢谢您的回复。现在我注意到,如果我将实体类移动到spring boot模块,那么一切都正常工作。是的,spring boot加载时使用的版本是:HH000412:Hibernate ORM core version 5.4.23。最后感谢您的响应。现在我注意到,如果我将实体类移动到SpringBoot模块,那么一切都正常工作。是的,SpringBoot加载时使用的版本是:HH000412:HibernateORMCoreVersion5.4.23.Final
Caused by: org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
at org.hibernate.cfg.annotations.QueryBinder.bindNativeQuery(QueryBinder.java:206) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.cfg.AnnotationBinder.bindQueries(AnnotationBinder.java:408) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:580) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:248) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:230) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:273) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.23.Final.jar!/:5.4.23.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.1.jar!/:5.3.1]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.1.jar!/:5.3.1]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.1.jar!/:5.3.1]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
Object retVal = method.invoke(getNativeEntityManagerFactory(), args);
org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
final SessionFactoryBuilder sfBuilder = metadata().getSessionFactoryBuilder();