【问题标题】:Hibernate Pure native scalar queries are not yet supported尚不支持 Hibernate 纯本机标量查询
【发布时间】: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 的角度来看。

【问题讨论】:

标签: spring spring-boot hibernate spring-data-jpa


【解决方案1】:

因此,经过长时间的调试,我得出的结论是,我不小心 混合两个注释

@javax.persistence.NamedNativeQuery

@org.hibernate.annotations.NamedNativeQuery

删除

@org.hibernate.annotations.NamedNativeQuery

修复了问题

【讨论】:

    【解决方案2】:

    看起来您使用的 Hibernate 版本很旧。我看到您指定了一个版本,但我猜该版本已被其他依赖项覆盖。

    【讨论】:

    • 感谢您的回复。现在我注意到,如果我将实体类移动到 Spring Boot 模块,那么一切正常
    • 是的,spring boot 在加载时使用的版本是:HHH000412: Hibernate ORM core version 5.4.23.Final
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2014-07-23
    • 2014-06-07
    • 1970-01-01
    • 2015-03-07
    • 2021-10-22
    • 2020-01-12
    相关资源
    最近更新 更多