2016-11-29 22 views
1

我正在使用Spring數據JPA使用Spring應用程序。我實施了命名查詢方法來執行我的查詢。我在嘗試實現一個涉及2個表\實體類之間的連接的命名查詢時遇到了一些困難。如何正確地實現這個Spring數據JPA命名查詢,涉及2個表之間的JOIN?

所以我有這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! 

我想檢索相關的RoomTipology實例從房間開始。基本上我想這個SQL查詢翻譯成一個Spring數據JPA命名查詢:

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

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

我知道,如果我已經有一個對象我能獲得這個信息做:

room.getRoomTipology() 

但有時我只是有一個實例的ID,我想直接檢索相關RoomTipology object。

我該如何使用命名查詢來做到這一點?

+0

請問'的EntityManager#getReference(室註釋方法.class,7L).getRoomTipology()'做你想做的事情? – chrylis

回答

0

名稱的方法,你認爲它應該最好被命名的方式,傳遞一個roomId,而不是一個房間,因爲這是實際的搜索參數,並與

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

我知道我可以使用HQL來完成,但我該如何使用命名查詢? – AndreaNobili

相關問題