gpt4 book ai didi

java - 如何使用不同类中的 where 属性编写连接两个表的规范

转载 作者:行者123 更新时间:2023-11-30 22:27:07 25 4
gpt4 key购买 nike

启动应用程序并需要一个带有动态 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

最佳答案

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

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

public class CarSpecifications {
public static Specification<Car> withBrandName(final String name) {
return (root, query, cb) -> {
final Path<Brand> brandPath = root.get("brand");
return cb.equal(brandPath.<String>get("name"), name);
};
}

// TODO: withName, withType
}

您必须在此处添加多个方法,上面的方法仅适用于您的 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);
}

关于java - 如何使用不同类中的 where 属性编写连接两个表的规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com