我使用JPA2.1、Spring数据和CriteriaBuilder、谓词对我的JPA实体进行查询。我有一个父实体InvoiceSummary,它与名为ShipmentStop的子实体有@OneToMany关系。我想在子实体ShipmentStop上设置条件,但不确定如何进行。我还希望能够同时在父表和子表上设置条件。有没有一种方法可以使用谓词来实现这一点?例如,我想按子实体的departureDate、isFirstPick和isLastDrop字段进行搜索。除了子实体搜索条件外,我还可能希望搜索父实体dueDate。下面是我的实体代码和我如何生成查询的代码。
这是我的标准生成器
public Specification<T> isBetween(List<RangeFilter> filters) {
return new Specification<T>() {
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
for (RangeFilter filter: filters) {
if (!filter.getStartValue().isEmpty()) {
mapFilterCriteria(root, criteriaBuilder, predicates, filter);
}
}
return criteriaBuilder.and(predicates.toArray(new Predicate[]{}));
}
};
}
private void mapFilterCriteria(Root<T> root, CriteriaBuilder criteriaBuilder, List<Predicate> predicates, RangeFilter filter) {
if(root.get(filter.getName()).getJavaType().getName().equals("java.time.LocalDateTime")) {
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(filter.getName()), convertStringToLocalDate(filter.getStartValue())));
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(filter.getName()), convertStringToLocalDate(filter.getEndValue())));
}
else {
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(filter.getName()), filter.getStartValue()));
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(filter.getName()), filter.getEndValue()));
}
}
这是我的父实体公共类发票{
@Id
@Column(name = "shipment_id")
private int shipmentId;
@Column(name = "customer_id")
private int customerId;
@Column(name = "invoice_date")
@JsonFormat(pattern = "MM/dd/yyyy HH:mm")
private LocalDateTime invoiceDate;
@Column(name = "due_date")
private String dueDate;
@OneToMany(mappedBy = "invoice",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<ShipmentStop> shipmentStops;
这是我的子实体
@Entity
@Table(name = "shipment_stops")
public class ShipmentStop {
@Id
@Column(name = "shipment_stop_id")
private int shipmentStopId;
@Column(name = "shipment_id")
private int shipmentId;
@ManyToOne
@JoinColumn(name = "stop_type_id", referencedColumnName = "stop_type_id")
private ShipmentStopType shipmentStopType;
@Column(name = "is_firstpick")
private boolean isFirstPick;
@Column(name = "is_lastdrop")
private boolean isLastDrop;
@Column(name = "depart_date")
@JsonFormat(pattern = "MM/dd/yyyy HH:mm:ss")
private LocalDateTime departDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "shipment_id", insertable = false, updatable = false)
private Invoice invoice;
您可以尝试子查询,例如:
Subquery<?> subQuery = query.subquery(ShipmentStop.class);
Root<?> rootChild = subQuery.from(ShipmentStop.class);
subQuery
.select(rootChild.join("shipmentId"))
.where(criteriaBuilder.and(predicate1, predicate2)); // your predicates on children
root.get("shipmentId").in(subQuery);
谁能告诉我如何用Hazelcast谓词“in”子句吗。我想使用以下内容, 我想将值作为值的ArrayList传递。但是它抛出错误,因为它期望实现可比的对象。对此有任何解决方法吗?
问题内容: 我有以下用于构建条件构建器的标准代码段。 我想知道有什么方法可以使它更好,因为我将更多地使用条件和相同条件来获取记录数。 任何见解都是高度赞赏的 问题答案: 首先,您必须考虑以分层方式重组应用程序。您至少需要3层,DAO,Service和WebService。 有关数据库和JPA的所有内容都必须在您的DAO层中。并且所有与json相关的事物都必须在您的WebService层中。您的服务
谓词是指用方括号写的XPath表达式。 它指的是为某些条件限制节点集中的选定节点。 例如, 序号 序号 描述 1 选择第一个元素,它是元素的子元素。 2 选择最后一个元素,它是元素的子元素。 3 使用选择元素。 4 选择大于的元素。 示例 此示例通过迭代每个学生创建一个包含其详细信息的元素。 它计算节点的位置,然后打印学生的详细信息以及序列号。 文件:students.xml - 文件:stude
谓词 Clojure 提供了很多函数来充当谓词的功能 — 测试条件是否成立。它们的返回值是 true或者false。在Clojure里面 false 以及 nil 被解释成false. true 以及任何其他值都被解释成true, 包括0。谓词函数的名字一般以问号结尾。 反射是一种获取一个对象的特性,而不是它的值的过程。比如说对象的类型。有很多谓词函数进行反射。 测试一个对象的类型的谓词包括 cl
Predicates是评估条件并提供true或false值的函数。 我们在数字章节的例子中看到了谓词函数。 我们看过像'even?'这样的功能 用来测试一个数字是否是偶数,或'neg?' 用于测试数字是否大于零。 所有这些函数都返回true或false值。 以下是Clojure中谓词的示例。 (ns clojure.examples.example (:gen-class)) ;; This
谓词是针对某些特定条件测试其参数的函数,如果条件为假则返回nil,或者某些非零值是条件为真。 下表显示了一些最常用的谓词 - Sr.No. 谓词和描述 1 atom 它接受一个参数,如果参数是原子则返回t,否则返回nil。 2 equal 它需要两个参数,如果它们在结构上相等则返回t否则返回nil 。 3 eq 它需要两个参数,如果它们是相同的相同对象,则返回t ,共享相同的内存位置,否则返回ni