如何使用Spring Data JPA根据布尔参数包含或排除记录?

时间:2016-11-19 10:25:22

标签: spring jpa spring-data spring-data-jpa

我不是很喜欢 Spring Data JPA ,我对如何实现简单查询有以下疑问。

我有 AccomodationMedia 实体类映射数据库中的 accomodation_media

@Entity
@Table(name = "accomodation_media")
public class AccomodationMedia {

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

    @Column(name = "id_accomodation")
    private Long idAccomodation;

    @Column(name = "is_master")
    private boolean isMaster;

    @Lob
    @Column(name = "media")
    private byte[] media;

    private String description;

    private Date time_stamp;

    public AccomodationMedia() {
    }

    ...............................................................
    ...............................................................
    ...............................................................
    // GETTER AND SETTER METHODS
    ...............................................................
    ...............................................................
    ...............................................................
}

此类的实例表示与住宿(酒店)相关的照片

因此,您可以在前面的代码段中看到我有这个字段:

@Column(name = "id_accomodation")
private Long idAccomodation;

包含住宿的ID(我数据库中酒店的ID)。

我也有这个布尔字段指定图像是否是主图像

@Column(name = "is_master")
private boolean isMaster;

所以,此时,在我的存储库类中,我有这个方法应该返回与特定酒店相关的所有图像

@Repository
public interface AccomodationMediaDAO extends JpaRepository<AccomodationMedia, Long> {

   List<AccomodationMedia> findByIdAccomodation(Long accomodationId);

}

我想修改此方法,同时传递boolean参数,该参数指定是否还必须返回主图像或仅返回非主图像。

所以我试着这样做:

List<AccomodationMedia> findByIdAccomodationAndIsMaster(Long accomodationId, boolean isMaster);

但这不正确,因为设置为 true isMaster 参数只返回主图像(因为它首先选择全部住宿有特定的住宿ID,然后是 isMaster 字段设置为 true 的住所。

那么,我如何才能正确创建使用 isMaster 布尔参数的查询来包含或排除代表我的主图像的 AccomodationMedia 实例?

我知道我也可以使用本机SQL或HQL来执行此操作,但我更喜欢使用&#34;从方法名称创建查询&#34;

3 个答案:

答案 0 :(得分:3)

我没有如何测试这个,但基本上你的最终查询应该是:

id_accomodation = ?1 AND (is_master = ?2 OR is_master = false)

所以我会尝试以下方法签名:

findByIdAccomodationAndIsMasterOrIsMasterFalse(Long accomodationId, boolean isMaster);

答案 1 :(得分:2)

我会选择两种方法,一种用于isMaster,另一种用于假值,如下所示:

List<AccomodationMedia> findByIdAccomodationAndIsMasterFalse(Long accomodationId);

List<AccomodationMedia> findByIdAccomodationAndIsMasterTrue(Long accomodationId);

答案 2 :(得分:0)

将您的acommodation id更改为accomodationId而不是idAccomodation。当你写findByIdAccomodationAndIsMaster春天令人困惑 findById AccomodationAndIsMaster

试试这个惯例

@Column(name = "accomodation_id")
private Long accomodationId;