Spring Repository 接口:使用外键查找记录

Aar*_*ron 3 java spring-data-jpa spring-boot

我想使用两个外键获取现有记录。

基本上,我在这里拥有的是一条具有起点和终点的路线(两者都是终端实体)。

我的目标是创建一个函数来使用我的起点和目的地作为查询中的条件来获取路线记录。我目前不知道如何使用 Spring Data JPA 做到这一点。

下面是我的实体和关系映射。

@Entity
@Table(name = "ROUTE")
public class Route implements Serializable {

    public Route() {}

    public Route(Terminal origin, Terminal destination, int totalKM) {
        this.origin = origin;
        this.destination = destination;
        this.totalKM = totalKM;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ROUTE_ID")
    private long id;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
    @JoinColumn(name = "TERMINAL_ORIGIN_ID")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
    private Terminal origin;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
    @JoinColumn(name = "TERMINAL_DESTINATION_ID")
    private Terminal destination;

    //...Getters and Setters
}

@Entity
@Table(name = "TERMINAL")
public class Terminal implements Serializable {

    public Terminal() {}

    public Terminal(String name, Town town, List<Route> routes) {
        this.name = name;
        this.town = town;
        this.routes = routes;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "TERMINAL_ID")
    private long id;

    private String name;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
    @JoinColumn(name = "TOWN_ID")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
    private Town town;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Route> routes;

    //...Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)

现在我想在我的路由存储库中使用 findbyOriginAndDestination 之类的东西。我想尽可能避免在数据库中提取两次所以我想在我的存储库层中创建一个函数来使用我的来源和目的地来获取现有记录(如果有)

@Repository
public interface RouteRepository extends JpaRepository<Route, Long> {

    Route findByOriginAndDestination(long originId, long destinationId);

}
Run Code Online (Sandbox Code Playgroud)

Jav*_*ano 9

您可以通过查询属性表达式 指定相关实体的列作为查询条件

所以它可能是工作

@Repository
public interface RouteRepository extends JpaRepository<Route, Long> {

    Route findByOrigin_IdAndDestination_Id(long originId, long destinationId);

}
Run Code Online (Sandbox Code Playgroud)