有一个实体通过 @Formula 注释同时包含常规字段和计算字段。
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "persons")
@AuditTable(value = "persons_AUD", schema = "history")
@Audited
public class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "surname", nullable = false)
private String surname;
@Column(name = "middle_name")
private String middleName;
@Formula("CONCAT_WS( ' ', surname, name, middle_name ) ")
@NotAudited
private String fullName;
}
从 Spring Boot 2 迁移到 Spring Boot 3 后,执行自定义 Spring Data 请求时,开始抛出以下错误:
jakarta.servlet.ServletException:请求处理失败: org.springframework.dao.InvalidDataAccessResourceUsageException: 无法按名称查找列位置:fullName [Колонки fullName не найдено в этом ResultSet''е.] [n/a]; SQL [不适用]
但是,像 findAll() 这样的方法不会导致这样的错误。在迁移到Spring Boot 3之前,不会出现这个错误。请求方法本身如下所示:
@Query(value = " SELECT distinct p.* FROM persons p", nativeQuery = true)
List<Person> findBySomeCustomRequest();
该错误是由于在本机查询中未使用字段
fullName
导致的。这与无法按名称查找列位置:column1 [在此 ResultSet 中未找到列名column1]中的情况相同。从类中删除列或将其添加到本机查询中。