我想创建动态搜索规格。在数据库中,我有像半径,宽度和高度字段-取决于形状的类型。
我想添加请求参数,例如areaTo -这将返回面积小于或等于参数的形状。
我想添加一些 predicate ,但我找不到任何示例。我的意思是,我想添加这样的东西:
public static Specification<ShapeEntity> areaTo(double areaTo) {
return (root, query, criteriaBuilder) -> {
double area;
switch (root.get("type").toString()) {
case "CIRCLE":
area = Math.pow(Double.parseDouble(root.get("radius").toString()), 2) * Math.PI;
break;
case "RECTANGLE":
area = Double.parseDouble(root.get("width").toString()) * Double.parseDouble(root.get("height").toString());
break;
case "SQUARE":
area = Math.pow(Double.parseDouble(root.get("width").toString()), 2);
break;
default:
throw new IllegalArgumentException();
}
return criteriaBuilder.lessThanOrEqualTo(????, areaTo);
};
}
1条答案
按热度按时间e0uiprwp1#
我找到了一个解决方案,可以在一定程度上回答您的问题,您需要在这里创建一个
Expression
。您可以尝试修改此代码以满足您的需要:
您的
switch (root.get("type").toString())
在switch语句中不起作用,因为这里没有返回值,它们创建了一个查询。在这种情况下,您可以为每种类型的形状创建一个Predicate
,然后使用运算符or
将它们添加到criteriaBuilder
中有关我解决方案的更多信息,请查看link