我不是很喜欢 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;
答案 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;