Spring Boot JPA查询构建器报错:Cannot join to attribute of basic type
问题解决:Spring JPA查询报错
Cannot join to attribute of basic type 错误原因
Flight实体中的aircraft字段未配置JPA关联注解,被识别为基本类型,导致Spring JPA无法解析查询方法中aircraft.registration的关联属性访问路径,从而抛出异常。
解决方案
1. 修正Flight实体的关联配置
给aircraft字段添加@ManyToOne注解(一架飞机对应多个航班,属于多对一关联),并指定外键列:
@Getter @Setter @AllArgsConstructor @NoArgsConstructor @Entity @Table(schema = "schema1") public class Flight implements Serializable { @Id @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "flight_sequence" ) @SequenceGenerator( name = "flight_sequence", allocationSize = 1 ) @Column(nullable = false, updatable = false) private Long id; // 添加多对一关联注解,指定外键列(需与Flight表实际外键列名一致) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "aircraft_id", nullable = false) private Aircraft aircraft; private Date date; private String origin; private String destination; }
2. 验证Repository查询方法
修正关联后,原查询方法即可正常工作;也可以用@Query手动编写JPQL增强可控性:
public interface FlightRepository extends JpaRepository<Flight, Long> { // 原方法修正关联后可正常运行 Flight findFirstByDestinationAndAircraftRegistrationOrderByDateDesc(String destination, String registration); // 可选:手动JPQL查询,逻辑更直观 @Query("SELECT f FROM Flight f WHERE f.destination = :destination AND f.aircraft.registration = :registration ORDER BY f.date DESC") Flight findLatestFlightByDestinationAndAircraftRegistration(@Param("destination") String destination, @Param("registration") String registration); }
3. 额外注意事项
- 确保Flight数据库表存在
aircraft_id外键列,关联到schema2中Aircraft表的id列 - 确认数据库用户拥有schema1和schema2的访问权限
- 实体已通过
@Table(schema = "...")指定所属schema,无需额外配置跨schema访问
内容的提问来源于stack exchange,提问作者GoingAround
相关产品推荐
相关产品推荐

