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();