【发布时间】:2020-12-10 22:28:40
【问题描述】:
我正在处理一个多模式项目并遇到非常令人沮丧的错误
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>
模块 B 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.moduleB</groupId>
<artifactId>B</artifactId>
<version>1.0-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>
<dependency.scope>provided</dependency.scope>
<moduleA.version>0.0.1-SNAPSHOT</moduleA.version>
<maven.compiler.plugin>3.8.1</maven.compiler.plugin>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<spring.cloud.dependencies.version>Hoxton.SR9</spring.cloud.dependencies.version>
<spring-jms.version>5.3.1</spring-jms.version>
<javax.json-api.version>1.0</javax.json-api.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.dependencies.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>${javax.json-api.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>lt.lrmuitine</groupId>
<artifactId>moduleA</artifactId>
<version>${moduleA.version}</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>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
模块 A 中的类:
package com.moduleA.entity;
import org.hibernate.annotations.NamedNativeQuery;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
@NamedNativeQuery(
name = "Test.doTest",
query = "select 1 from test")
@Entity
@Table(name = "test")
public class Test implements Serializable {
@Id
private Long loid;
}
package com.moduleA.transformer;
import org.springframework.stereotype.Component;
import javax.persistence.Tuple;
import java.util.ArrayList;
import java.util.List;
@Component
public class TestTransformer {
public List<TestDto> transform(List<Tuple> tuples) {
List<TestDto> testDtoList = new ArrayList<>();
for (Tuple tuple : tuples) {
testDtoList.add(new TestDto(tuple, 1));
}
return testDtoList;
}
}
模块 B 中的类
package com.moduleB.configuration;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfigModuleB {
}
package com.moduleB;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.jms.annotation.EnableJms;
@EnableJms
@SpringBootApplication(scanBasePackages = {"com.moduleB.*", "com.moduleA.*"})
@EntityScan(basePackageClasses = com.moduleA.entity.Test.class)
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
当我尝试执行这个类时
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);
}
}
我收到 org.hibernate.cfg.NotYetImplementedException:尚不支持纯本机标量查询
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]
附加信息:
AbstractEntityManagerFactoryBean.java 上的断点:516 行
Object retVal = method.invoke(getNativeEntityManagerFactory(), args);
是抛出此错误的执行点。
第 1 次更新
尝试执行
getNativeEntityManagerFactory().getMetamodel().getEntities()
来自 AbstractEntityManagerFactoryBean.java:516 行
给予
org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported
第 2 次更新
试图调用
em.getMetamodel().getEntities()
给出同样的错误
第 3 次更新
最令人惊讶同时又令人沮丧的时刻是 如果我将实体类移动到 Springboot 项目中,一切都只是 工作...
第 4 次更新
看来这个错误与将实体类放到不同的项目有关
第 5 次更新
这个错误的确切位置发生在
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.java 1255行
final SessionFactoryBuilder sfBuilder = metadata().getSessionFactoryBuilder();
试图执行方法 metadata(),但是 spring boot 吞下了这个错误 并且启动没有问题......稍后尝试使用 entityManager 它出现了...
第 6 次更新
找到罪魁祸首
类:org.hibernate.cfg.annotations.QueryBinder.java;
方法:public static void bindNativeQuery
行:206
似乎hibernate需要知道resultClass否则它会抛出这个错误......
7号更新
所以,我想我发现它为什么会抛出这个错误......感觉就像一个错误 spring-boot 的一侧,等等
当您在主类的主项目(spring-boot)中的单独项目中拥有实体时,您必须添加注释
@EntityScan(basePackageClasses = {myEntityFromOtherProject.class}),
但似乎背后的功能
@EntityScan
转化
@javax.persistence.NamedNativeQuery
到
@org.hibernate.annotations.NamedNativeQuery
并且发生的正是 更新号中描述的情况。 6
,但是当注解时
@EntityScan
未使用且实体类与spring-boot项目在同一个项目中 然后不会发生这样的转换,休眠只是执行分配的代码 到注释
javax.persistence.NamedNativeQuery
定义在
类:org.hibernate.cfg.AnnotationBinder.java
行:411
所以,我猜这是一个错误......从 Spring Boot 的角度来看。
【问题讨论】:
-
感谢您的回复,在发布到 stackoverflow 之前,我已经尝试过您提供的解决方案,但它们对我不起作用,无论 sql 返回什么(1 列结果或 4 列结果)都是同样的错误
标签: spring spring-boot hibernate spring-data-jpa