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

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

我不太喜欢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;

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

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

最后是住宿实体类:

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

我该怎么做?

最佳答案

请尝试:

@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

关于java - 如何将此 3 JOIN 查询转换为 Spring Data JPA 命名查询方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821449/

相关文章:

Java语法解释

java - 如何获取枚举的可能项目数?

java - 如何在 Spring Boot XML 文件中注册一个 servlet?

java - 维护调用之间状态的 Hibernate NamingStrategy 实现

java - Android 应用程序在播放声音时崩溃

java - Android Studio map 重置为默认 View 应用程序重新启动

java - Spring - 在jsp文件上显示图像

java - 这是工厂模式的完美问题吗?

java - 在 jpa 2.1 中使用 ManyToMany 时分离的实体

java - 为什么 hibernate 在执行 saveAndFlush 之前再次加载实体?