成功解决at org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking

Hibernate的天坑!!!!

Hibernate的天坑!!!!

Hibernate的天坑!!!!

Hibernate的天坑!!!!

Hibernate的天坑!!!!

案例说明:

无意中遇到一个hibernate的天坑,困扰了好久终于找到解决办法

在使用Hibernate查询的时候,为了使用自定义的SQL来进行复杂的查询操作,使用了hibernate的session.createQuery方法来构造查询。

代码如下

 public List queryAll() {
        return template.execute(new HibernateCallback>() {
            String hql="from com.fdw.study.bean.TBean";
            @Override
            public List doInHibernate(Session session) throws HibernateException {
                Query createQuery = session.createQuery(hql,TBean.class);
                List list = createQuery.list();
                if(list!=null&&list.size()>0)
                    return list;
                return null;
            }
        });
    }

但是在使用这个方法的时候一直报错,用不了

java.lang.ArrayIndexOutOfBoundsException: 0
	at org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking(AbstractSharedSessionContract.java:833) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
	at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:817) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
	at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:113) ~[hibernate-core-5.4.21.Final.jar:5.4.21.Final]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_381]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_381]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_381]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_381]
	at 

实体类TBean如下

package com.fdw.study.bean;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "TEST")
public class TBean {
    @Id
    private String id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "AGE")
    private String age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "TBean{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

为此翻阅了大量资料,才知道是实体类和数据表绑定有问题,但是我已经使用了@Entity和@Table两个注解了吗,@EntityScan注解也用上了,尝试了无数次,还是报错。

最后使用原生的hibernate的实体类绑定数据表的方法,配置hbm.xml文件,终于能正常查询出来了

原因如下:

我的项目中只引入了hibernate的依赖,没有引入JPA的依赖,导致@EntityScan其实是不生效的

使用 @EntityScan 注解必须要引入 JPA 的依赖。@EntityScan 是 Spring Framework 提供的一个注解,用于告诉 Spring 扫描指定包路径下的 JPA 实体类,以便进行配置和管理。而 JPA(Java Persistence API)是一种标准的 Java 数据持久化规范,它定义了一套操作数据库的 API。

@EntityScan 注解需要引入 JPA 的依赖,因为它的主要目的是与 JPA 相关的实体类进行关联。如果你不引入 JPA 的依赖,那么 @EntityScan 注解将无法生效,因为它需要依赖 JPA 的基础设施来扫描和管理实体类。

结论:

要使用@EntityScan的话必须引入JPA,这个要看项目上情况,否则只能通过写hnm.xml文件的方式进行绑定。

注意:

使用xml配置的方式时application.yml文件需添加如下配置

hibernate:
  # HBM文件扫描路径配置
  mappingLocations:
    - classpath*:/config/system/hbm/*.xml
    - classpath*:/config/*.hbm.xml
    - classpath*:/config/hbm/*.hbm.xml

hbm.xml 文件




	
		
		
		
	

你可能感兴趣的:(java,hibernate,python)