如何编写规范连接两个表,其中属性在不同的类中

时间:2016-01-19 14:10:00

标签: java mysql spring-boot spring-data-jpa criteria

启动应用程序,需要一个带动态where字段的查询。谷歌搜索我发现规格可能是一个答案,但如何使where子句在不同的类中搜索属性?

这是我的模特

品牌类

@Entity
public class Brand {

@Id
private Long id;

private String name;

@OneToMany(mappedBy="brand",cascade=CascadeType.ALL)
private Set<Cars> cars;
//Getter's and Setters
}

汽车类

@Entity
public class Car {

@Id
private Long id;
private String name;
private String carType;

@ManyToOne(cascade=CascadeType.ALL)
private brand brand;
//Getter's and Setters
}

存储库是海峡存储库:

public interface CarRepository extends JpaRepository<Car, Long>, JpaSpecificationExecutor<Car> {    
}

如果用户输入汽车的名称和品牌我需要类似下面的jpql

 select c from car c join c.brand br where br.name = :brandName and c.name = :carName

此外,用户只能输入汽车的类型,因此jpql将是:

select c from car c join c.brand br where br.name = :brandName and c.carType = :carType

1 个答案:

答案 0 :(得分:0)

当您需要构建动态查询时,通常会使用规范。如果您的用例仅限于这两个查询,我宁愿将它们写为静态查询,并使用简单的if / else检查是否提供了名称或类型。

当您使用规范并遵循Spring指南时,您应该编写一个具有各种规范的附加类,例如:

br.name = :brandName

您必须在此处添加多个方法,上述方法仅适用于您的public List<Car> findCars(String brandName, String name, String type) { Specifications<Car> spec = Specifications .<>where(CarSpecifications.withBrandName(brandName)); if (name != null) { spec.and(CarSpecifications.withName(name); } // TODO: if (type != null) ... return repository.findAll(spec); } 子句。

现在,要使用此类,您必须编写类似的内容:

dd(\Auth::user())