首页 > 解决方案 > 创建具有一对一关系的查询

问题描述

我有两张桌子......一个贷款表和一个客户表。客户可以进行多笔贷款,但我想将客户一次限制为一笔有效贷款。在第一笔贷款完成之前,他们无法创建第二笔贷款(loan.active=false

我已经这样设置了我的贷款表:

@Entity
public class Loan implements Serializable {

private static final long serialVersionUID = 0x62B6DA99AA12AAA8L;

@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id;

@OneToOne(fetch = FetchType.LAZY)
private Customer customer;

@Column private String dateLoaned;
@Column private String dateToReturn;
@Column private String dateOfReturn;
@Column private Boolean active=false;

和这样的客户表:

@Entity
public class Customer implements Serializable {

private static final long serialVersionUID = 0x63A6DA99BC12A8A8L;

@Column @GeneratedValue(strategy = GenerationType.AUTO) @Id private Integer id;
@Column private String firstname;
@Column private String surname;
@Column private String address;
@Column private String town;
@Column private String postcode;
@Column (unique=true) private String personalnumber;
@Column (unique=true) private String emailaddress;


@OneToOne(fetch = FetchType.EAGER)
private Loan loan;

这使我可以为同一客户创建新贷款。到现在为止还挺好。

我想做一个查询,让我可以找到客户是否已经有活跃的贷款。

到目前为止,我的贷款库是:

@Query("select loan_id from Loan l where l.customer.id = :customerId and l.active = true")
Boolean customerHasActiveLoan(@Param("customerId") Integer customerId);

这是正确的方法吗?

标签: spring-data-jpa

解决方案


spring-data-jpa你可以拥有@Query或编写一个生成查询的方法。没有什么错,@Query但是因为您的存储库方法非常简单,您也可以仅使用方法名称

例如,相当于:

//Will return the active loan, if exists, or null
@Query("select l from Loan l where l.customer.id = :customerId and l.active = true")
public Loan getActiveLoad(@Param("customerId") Integer customerId)

可以简化为

public Local findOneByCustomerIdAndActiveIsTrue(Long id)

有时method name方法可以生成长方法名称,因此,如果您愿意,可以使用@Query注解


推荐阅读