Можете ли вы помочь понять, как использовать JOIN с Spring-хранилище? - PullRequest
1 голос
/ 20 сентября 2019

Я хочу понять, как использовать JOIN с JPA-spring-repositories.Есть две таблицы Человек и Автомобиль

Man
varchar(25) manId primary key not null
varchar(25) name
varchar(25) surname
varchar(25) modelCar

Car
varchar(25) carId primary key not null,
varchar(25) color,
varchar(25) model;

И визуализация:

    Man
    mainId   name     surname   modelCar
    =====================================
    111-1    Natasha  Smith     reno-123
    111-2    Maria    John      mazda-214


    Car
    carId      color     model
    ============================
    as-aw    red       reno-123
    os-dz    black     mazda-214
    sa-aa    yeallow   porche-1

Отношение один к одному

Мои сущности

@Entity
@Table
@Getter @Setter @NoArgsConstructor 
class ManRecord{
   private String manId;
   private String surname;
   private String modelCar;
}

@Entity
@Table
@Getter @Setter @NoArgsConstructor
class CarRecord{
   private String carId;
   private String color;
   private String model;
}

Итак, мне нужно написать JPA-репозитории для выполнения результата объединения: имя, фамилия и цвет машины:

select m.name, m.surname, c.color from Man m left join Car c on m.modelCar=c.model;

Можете ли вы помочь мне с этим?

Я пыталсяна

@Repository
public interface ManRepository extends CrudRepository<Man, String>{
   @Query("select m.name, m.surname, c.color from Man m left join Car c on m.modelCar=c.model", nativeQuery=true)
   List<Object> agregateData();
}

но я не хочу получать просто Object.

и я попробовал кого-то с @OneToOne, но мне это не помогло

1 Ответ

0 голосов
/ 20 сентября 2019

Прежде всего, не стоит объединять эти объекты с помощью модели car - у каждого man могут быть любые машины, поэтому это объединение не является репрезентативным.Лучший способ - добавить r_man_id в таблицу Car.Это позволит вам определить владельца автомобиля.После этого вы можете добавить однонаправленное отношение @OneToMany между ними:

@Entity
@Table
@Getter @Setter @NoArgsConstructor 
class ManRecord{

    @JoinColumn(name = "r_man_id", referencedColumnName = "manId")
    private List<CarRecord> cars = new ArrayList<>();

    private String manId;
    private String surname;
    private String modelCar;
}

@Entity
@Table
@Getter @Setter @NoArgsConstructor
class CarRecord{
    private String carId;
    private String color;
    @Column(name="r_man_id")
    private Long refManId;
    private String model;   
}

Затем создайте нужную вам модель:

class ManWithCarObject {
    String name;
    String surename;
    String color;

    /**
    * Default
    **/
    public ManWithCarObject(){      
    }

    public ManWithCarObject(String name, String surename, String color) {
        this.name = name;
        this.surename = surename;
        this.color = color;
    }

    // other methods
}

И тогда репо будет:

@Repository
public interface ManRepository extends CrudRepository<Man, String>{
   @Query("select new com.contoso.model.ManWithCarObject(m.name, m.surename, m_c.color) from ManRecord m inner join m.cars m_c where m.manId = m_c.refManId")
   List<ManWithCarObject> agregateData();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...