【问题标题】:Criteria API Path Navigation With List使用列表的标准 API 路径导航
【发布时间】:2022-11-29 03:00:15
【问题描述】:

我们如何将字段列表与 Criteria API 路径导航进行比较

criteriaBuilder.equal(propertyRoot.join("amenities")
        .join("interiors").<String>get("name"), "Gym");

我在上面的代码中遇到错误

财产实体

class Property {
 ...
 @OneToOne(
        mappedBy = "property",
        cascade = CascadeType.ALL
 )
 @JsonManagedReference
 private Amenities amenities;
}

设施实体

class Amenities {
 ...
 @OneToMany(
        mappedBy = "amenities",
        cascade = CascadeType.ALL
 )
 @JsonManagedReference
 private List<Interiors> interiors;
}

室内实体

public class Interirios {
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private int id;
 private String name;
}

【问题讨论】:

  • 您编写的条件查询根本没有意义,您想将字段与“in”表达式进行比较并连接谓词?

标签: java spring-boot jpa


【解决方案1】:

目前还不清楚你想要什么提供的选择表达式和条件查询,但我可以想象你想要从一些其他关联的实体进行连接并将 in 表达式作为 predicate

您问

我们如何将记录列表与 CriteriaBuilder 进行比较并在关联时加入。

您需要传递两个谓词,一个用于 join 考虑,另一个用于 in 表达式。这样做的一种做法

Root<R> root = query.from(type);
Join<R, ?> join = root.join("association_field", JoinType.LEFT);
criteriaQuery.select(root.get("path+selection").get("some_atribute_in_current_path")).where(join.on(root.get("in_expersion_field").in(some_list)).getOn())

再次澄清一下,"in_expersion_field" 代表您希望具有带有某些给定列表的 in 子句的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多