java - 你能帮助理解如何使用 JOIN 与 spring-repository 吗?

标签 java database spring jpa

我想了解如何将 JOIN 与 JPA-spring-repositories 一起使用。 有两张表Man和Car

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

但我不想只获取对象。

而且,我尝试了@OneToOne 的人,但这对我没有帮助

最佳答案

首先,通过汽车模型连接这些实体并不是一个好主意 - 每个可以拥有任何汽车,因此这种连接不具有代表性。最好的方法是将 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();
}

关于java - 你能帮助理解如何使用 JOIN 与 spring-repository 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58024306/

相关文章:

java - 解析 xml 找不到架构文件

java - 在运行时,private、public、package 关键字之间有什么区别吗?

java - jdbc - 一个查询中的多个选择语句

database - 计算过载时的数据库性能

java - Spring Boot 应用程序,已弃用 swagger-ui ApiInfo() 方法。需要替代方案

java - 查找 spring-data-mongo MappingContext 内存泄漏

java - 将 DATE 插入 MYSQL 数据库..将值从 Android 发送到 PHP

MySQL 选择这个和那个

php - 在应用程序和网络之间共享数据库

java - 从 IDE 运行 Spring 集成测试