java.sql.SQLRecoverableException:使用 2 个映射表时无法从套接字读取更多数据

问题描述 投票:0回答:1

我正在使用 Spring data JPA 从数据库检索数据。

我有以下2个表:部门和班级。部门和班级之间存在一对多关系。

Department columns: Dept_Id, Dept_Name, CreatedDate
Class columns: Class_Id, Dept_Id, Class_Type, Class_Name

我正在尝试根据班级类型和班级名称获取部门列表。

我创建了如下实体:

@Table(name = "Department")
@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Dept_Id", nullable = false)
    private Long DeptId;

    @Column(name = "Dept_Name", nullable = false, length = 256, unique = true)
    private String DeptName;

    @Column(name = "CreatedDate", length = 256)
    private String CreatedDate;

    @OneToMany(mappedBy = "Department", fetch = FetchType.EAGER)
    @ToString.Exclude
    private Set<Class> classess;
}

@Table(name = "Class")
@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Class {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Class_Id", nullable = false)
    private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "Dept_Id", nullable = false)
    @ToString.Exclude
    @JsonIgnore
    private Department department;

    @Column(name = "Class_Type", length = 256)
    private String classType;

    @Column(name = "Class_Name", length = 256)
    private String className;
}

部门存储库

@Repository
public interface DepartmentRepository extends JpaRepository<Department, Long> {
     @Query(nativeQuery = true,
           value="SELECT dept.* " +
                   "FROM Department dept INNER JOIN Class cls ON dept.DeptId = cls.DeptId " +
                   "WHERE cls.classType = 'class1' " +
                   "AND cls.className IN :name " +
                   "ORDER BY START_TIME DESC")
  List<Department> findDepartmentByClassType(@Param("name") List<String> name);
}

类存储库

@Repository
public interface ClassRepository extends JpaRepository<Class, Long> {
}

服务:

@Service
public class DepartmentService {
     public List<Department> getDepartmentsForClassType(List<String> className) {
        departmentRepository.findDepartmentByClassType(className);
}

当我运行应用程序时,出现以下错误:

java.sql.SQLRecoverableException: No more data to read from socket
    at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:784) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:429) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:407) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:268) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:501) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1292) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1025) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:743) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar:na]
    j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

我相信此错误是由于我映射两个实体的方式中的代码问题造成的。 我这么说的原因是因为如果我更新存储库的 select 语句以仅从部门表获取记录而不与类表连接,那么应用程序将成功运行。 有人可以帮我弄清楚我在这里做错了什么吗?

java spring-boot jpa spring-data-jpa spring-data
1个回答
0
投票

如果连接到类表导致出现问题,请检查以下内容:

  1. 确保类表中存在匹配的记录。
  2. 验证连接条件的准确性。
  3. 检查类表的访问权限。
  4. 检查实体字段和表列之间的映射。
© www.soinside.com 2019 - 2024. All rights reserved.