如何将此 3 JOIN 查询转换为 Spring Data JPA 命名查询方法?

How can I convert this 3 JOIN query into a Spring Data JPA named query method?

我不太喜欢 Spring Data JPA,我在尝试实现命名查询(由方法名称定义的查询)时遇到以下问题。

我有这 3 个实体 classes:

@Entity
@Table(name = "room_tipology")
public class RoomTipology implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "tipology_name")
    private String name;

    @Column(name = "tipology_description")
    private String description;

    @Column(name = "time_stamp")
    private Date timeStamp;


    @OneToMany(mappedBy = "roomTipology")
    private List<Room> rooms;

    @OneToOne(mappedBy = "roomTipology")
    private RoomRate roomRate;

    // GETTER AND SETTER METHODS
}

表示房间的拓扑结构并且包含此字段

@OneToMany(mappedBy = "roomTipology")
private List<Room> rooms;

因此它包含与特定房间类型关联的房间列表,所以我有这个 房间 实体 class:

@Entity
@Table(name = "room")
public class Room implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "id_accomodation_fk", nullable = false)
    private Accomodation accomodation;

    @ManyToOne
    @JoinColumn(name = "id_room_tipology_fk", nullable = false)
    private RoomTipology roomTipology;

    @Column(name = "room_number")
    private String number;

    @Column(name = "room_name")
    private String name;

    @Column(name = "room_description")
    @Type(type="text")
    private String description;

    @Column(name = "max_people")
    private Integer maxPeople;

    @Column(name = "is_enabled")
    private Boolean isEnabled;

    // GETTER AND SETTER METHODS
}

表示住宿的房间,它包含这个带注释的字段:

@ManyToOne
@JoinColumn(name = "id_accomodation_fk", nullable = false)
private Accomodation accomodation;

最后 住宿 实体 class:

@Entity
@Table(name = "accomodation")
public class Accomodation implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "accomodation")
    private List<Room> rooms;

    @Column(name = "accomodation_name")
    private String name;

    @Column(name = "description")
    @Type(type="text")
    private String description;

    // GETTER AND SETTER METHODS
}

好的,现在我有这个 Spring Data JPA 存储库 class 用于 RoomTipology:

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface RoomTipologyDAO extends JpaRepository<RoomTipology, Long> {


}

这里我想定义一个命名查询方法,return 向我提供与特定住宿相关的所有 RoomTipology 对象的列表,我已经使用SQL 并且工作正常:

SELECT * 
FROM room_tipology as rt
JOIN room r 
ON rt.id = r.id_room_tipology_fk
JOIN accomodation a
ON r.id_accomodation_fk = a.id
WHERE a.id = 7

但现在我想用命名查询方法(或至少使用 HQL)翻译它

我该怎么做?

请尝试:

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface RoomTipologyDAO extends JpaRepository<RoomTipology, Long> {

   List<RoomTipology> findByRooms_Accomodation(Accomodation accomodation);

}

The query builder mechanism built into Spring Data repository infrastructure is useful for building constraining queries over entities of the repository. The mechanism strips the prefixes find…By, read…By, query…By, count…By, and get…By from the method and starts parsing the rest of it

At query creation time you already make sure that the parsed property is a property of the managed domain class. However, you can also define constraints by traversing nested properties.

文档:Here