簡體   English   中英

如何才能正確實現涉及兩個表之間的JOIN的Spring Data JPA命名查詢?

[英]How can I correctly implement this Spring Data JPA named query that involves a JOIN between 2 tables?

我正在使用Spring Data JPA處理 Spring應用程序。 我實現了命名查詢方法來實現我的查詢。 我在嘗試實現涉及2個表\\實體類之間的連接的命名查詢時遇到一些困難。

所以我有這兩個實體類:

1)代表住宿房間的房間:

@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;

    // CONSTRUCTOR, GETTER AND SETTER METHODS
}

如您所見,此類包含此字段:

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

將許多Room實例鏈接到RoomTipology實例。

2)然后我有RoomTipology實體類:

@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;

    // CONSTRUCTOR, GETTER AND SETTER METHODS
}

然后我有RoomTipology實體類的這個存儲庫clas,類似於:

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

    RoomTipology findByRoomTipology_Room(Room room);

}

我試過這種方式,但它不能工作,我收到以下錯誤信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'roomTipologyDAO': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property roomTipology found for type RoomTipology!

我想從Room中檢索相關的RoomTipology實例。 基本上我想將此SQL查詢轉換為Spring Data JPA命名查詢:

SELECT * 
FROM `room_tipology` rt 
INNER JOIN room r
ON rt.id = r.id_room_tipology_fk
WHERE r.id = 7

其中r.id是Room實體的id字段的值。

我知道如果我已經有一個Room對象,我可以獲取這些信息:

room.getRoomTipology()

但有時我只有一個Room實例的id,我想直接檢索相關的RoomTipology對象。

如何使用命名查詢來完成?

以您認為最佳方式命名您的方法,傳遞roomId而不是房間,因為這是您的實際搜索參數,並使用方法注釋方法

@Query("select t from Room r join r.roomTypology t where r = :roomId")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM