【问题标题】:How to get the parent entity from the child primary key in spring data jpa?如何从spring data jpa中的子主键获取父实体?
【发布时间】:2020-05-16 02:30:41
【问题描述】:

您好,我有父实体 User,它与 Vehicle 实体具有一对多关系,而 Vehicle 实体与 User 具有多对一关系。我的车辆表中有一个外键“user_fk”。我有一个 UserRepository,它扩展了 Spring Data JPARepository,它具有 save 和 findById 方法。

此外,我在车辆表中有两个属性可以唯一标识车辆,我需要使用该数据来找出相应的用户对象。我知道这可以通过创建扩展 JPA 存储库并可以使用的车辆存储库来简单地完成通过方法查找,但我不想创建新的车辆存储库类只是为了实现此功能。如何在不创建 Vehicle Repository 的情况下找到 User_fk 列值或 User 对象?我可以使用 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 的值,我想从这两个属性值中获取 User 对象。

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

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    您需要在 UserRepository 中使用带有 JOIN 的 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);
    

    【讨论】:

      【解决方案2】:

      您可以像这样从您的用户存储库中执行此操作

      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);
      

      【讨论】:

      • 我只需要user_fk列对应的值
      • 谢谢。我试试这个。
      • 我需要在我的 userRepository 类中使​​用它。对吗??
      • 是的,在您的用户存储库中使用它
      • 如果我的属性名和列名不同怎么办。假设我的属性名是vehcile id,列名是vehicle_identifier。我们应该在查询或 findbymethod 中使用哪一个??
      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 2023-03-19
      • 2018-12-03
      • 2016-01-20
      • 2011-03-20
      • 2021-01-18
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多