启动应用程序,需要一个带动态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
答案 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())