Как получить родительскую сущность от дочернего первичного ключа в данных весны jpa? - PullRequest
1 голос
/ 30 января 2020

Привет, у меня есть родительская сущность Пользователь, которая имеет отношение один ко многим с сущностью Автомобиль, а сущность транспортного средства имеет отношение много к одному с Пользователем. У меня есть внешний ключ "user_fk" в моей таблице транспортных средств. У меня есть UserRepository, который расширяет Spring Data JPARepository, который имеет методы save и findById.

Также у меня есть два атрибута в таблице транспортных средств, которые однозначно идентифицируют транспортное средство, и мне нужно использовать эти данные, чтобы найти соответствующий объект пользователя. Я знаю, что это можно сделать, просто создав репозиторий Vehicle, который расширяет репозиторий JPA и может использовать метод find by, но я не хочу создавать новый класс репозитория Vehicle только для достижения этой функциональности. Как найти значение столбца 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. .Я знаю, что это может быть достигнуто путем создания репозитория транспортных средств, который расширяет репозиторий JPA в springdatajpa.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы можете сделать это из своего пользовательского репозитория следующим образом:

User findByVehicles_VehicleIdAndVehicles_VehicleName(Long id, String name);

Обратите внимание, что это вызовет исключение, если есть несколько пользователей, удовлетворяющих условиям

Если вы хотите получить только идентификатор Вы должны положиться на пользовательский запрос

@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);
0 голосов
/ 30 января 2020

Вам необходимо использовать JPQL-запрос с JOIN в репозитории User:

@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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...