有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从spring数据jpa中的子主键获取父实体?

您好,我有父实体用户,它与车辆实体有一对多关系,车辆实体与用户有多对一关系。我的车辆表中有外键“user_fk”。我有一个UserRepository,它扩展了SpringDataJParepository,它有save和findById方法

此外,我在vehicle表中有两个唯一标识车辆的属性,我需要使用这些数据找出相应的用户对象。我知道这可以通过创建一个车辆存储库来实现,该存储库扩展了JPA存储库,并且可以使用find by方法,但我不想仅仅为了实现这一功能而创建一个新的车辆存储库类。在不创建车辆存储库的情况下,如何查找用户\u fk列值或用户对象??我可以使用UserRepository实现这一点吗

我的用户类:

    @Entity
    @Table(name = "usr")
    class User{
    @Id
    @Column(name = "user_id", updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;
    private String username;
    @OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
    private List<Vehicle> vehicles= new ArrayList<>();
    //getters and setters
    }

我的车辆类别:

       @Entity
       @Table(name = "vehicle")
       class Vehicle{
       @Id
       @Column(name = "vehicle_id", updatable = false, nullable = false)
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long vehicleId;
       private String vehicleName;
       @ManyToOne(fetch = FetchType.LAZY)
       @JoinColumn(name = "user_fk" , nullable = false)
       private User user;
      //getters and setters 
      }

我有vehicleId和vehicleName的值,我想从这两个属性值中得到用户对象

我不想仅仅为了找到用户对象而创建车辆存储库。我知道这可以通过创建一个车辆存储库来实现,该存储库扩展了springdatajpa中的JPA存储库


共 (2) 个答案

  1. # 1 楼答案

    您可以从您的用户存储库这样做

    User findByVehicles_VehicleIdAndVehicles_VehicleName(Long id, String name);
    

    请注意,如果有多个用户满足条件,这将引发异常

    如果只想获取id,则必须依赖自定义查询

    @Query("select u.userId from User u join u.vehicles v where v.vehicleId=?1 and v.vehicleName=?2")
    Long getUserIdByVehicleIdAndName(Long id, Long name);
    
  2. # 2 楼答案

    您需要在UserRepository中使用带有联接的JPQL查询:

    @Query("select u from User u JOIN u.vehicles v where v.vehicleId = :vehicleId and v.vehicleName= :vehicleName")
    User findUserByVehicleIdAndName(@Param("vehicleId") Long vehicleId, @Param("vehicleName") String vehicleName);