【问题标题】:How can I convert this 3 JOIN query into a Spring Data JPA named query method?如何将此 3 JOIN 查询转换为 Spring Data JPA 命名查询方法?
【发布时间】:2017-04-10 19:49:58
【问题描述】:

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

我有这 3 个实体类:

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

所以它包含与特定房间拓扑相关的房间列表,所以我有这个 Room 实体类:

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

最后是Accomodation实体类:

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

好的,现在我有了 RoomTipology 的 Spring Data JPA 存储库类:

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


}

在这里,我想定义一个命名查询方法,它返回给我与特定住宿相关的所有 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

我该怎么做?

【问题讨论】:

  • 请检查我的回答@AndreaNobili

标签: java spring hibernate spring-data-jpa named-query


【解决方案1】:

请尝试:

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

   List<RoomTipology> findByRooms_Accomodation(Accomodation accomodation);

}

Spring Data 存储库基础结构中内置的查询构建器机制对于在存储库的实体上构建约束查询很有用。该机制从方法中去除前缀​​ find...By、read...By、query...By、count...By 和 get...By 并开始解析其余部分

在创建查询时,您已经确保解析的属性是托管域类的属性。但是,您也可以通过遍历嵌套属性来定义约束。

文档:Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2022-01-23
    • 2017-09-17
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2020-06-09
    • 2022-01-17
    相关资源
    最近更新 更多