Spring Data JPA如何使用 predicate

7hiiyaii  于 2022-11-24  发布在  Spring
关注(0)|答案(1)|浏览(178)

我想创建动态搜索规格。在数据库中,我有像半径,宽度和高度字段-取决于形状的类型。
我想添加请求参数,例如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);
    };
}
e0uiprwp

e0uiprwp1#

我找到了一个解决方案,可以在一定程度上回答您的问题,您需要在这里创建一个Expression
您可以尝试修改此代码以满足您的需要:

private Specification<Shape> areaTo(double areaTo, String type) {
    return (root, query, criteriaBuilder) -> {
        Expression<Double> area;
        switch (type) {
            case "CIRCLE":
                Expression<Double> radius = root.get("radius");
                Expression<Double> power = criteriaBuilder.prod(radius, radius);
                area = criteriaBuilder.prod(power, Math.PI);
                break;
            case "RECTANGLE":
                Expression<Double>  width = root.get("width");
                Expression<Double> height = root.get("height");
                area = criteriaBuilder.prod(width, height);
                break;
            case "SQUARE":
                Expression<Double> width_s = root.get("width");
                area = criteriaBuilder.prod(width_s, width_s);
                break;
            default:
                throw new IllegalArgumentException();
        }
        return criteriaBuilder.lessThanOrEqualTo(area, areaTo);
    };
}

您的switch (root.get("type").toString())在switch语句中不起作用,因为这里没有返回值,它们创建了一个查询。在这种情况下,您可以为每种类型的形状创建一个Predicate,然后使用运算符or将它们添加到criteriaBuilder
有关我解决方案的更多信息,请查看link

相关问题