public class Referral {
long id;
Date createdDate;
B anotherObject1;
C anotherObject2;
..... etc
}
public Specification<ClinAssistReferral> getSpecification(Contact currentContact) {
return (itemRoot, query, criteriaBuilder) -> {
List<Predicate> finalQueries = new ArrayList<>();
finalQueries.add(criteriaBuilder.equal(itemRoot.get("anotherObject1").get("field1"), currentContact.getId()));
finalQueries.add(criteriaBuilder.equal(itemRoot.get("anotherObject2").get("field5"), currentContact.getJeta()));
return criteriaBuilder.and(finalQueries.toArray(new Predicate[0]));
};
}
Specification< Referral > spec = getSpecification(currentContact);
List<Referral> refs = repository.findAll(spec, pageable);
@Override
@NonNull
List<Referral> findAll(@Param("spec") Specification<Referral> spec);
我尝试通过添加以下内容来更改规范创建方法:
return (itemRoot, query, criteriaBuilder) -> {
List<Selection<?>> selectionList = new ArrayList<>();
selectionList.add(itemRoot.get("id"));
selectionList.add(itemRoot.get("createdDate"));
query.multiselect(selectionList);
List<Predicate> finalQueries = new ArrayList<>();
finalQueries.add(criteriaBuilder.equal(itemRoot.get("anotherObject1").get("field1"), currentContact.getId()));
finalQueries.add(criteriaBuilder.equal(itemRoot.get("anotherObject2").get("field5"), currentContact.getJeta()));
return criteriaBuilder.and(finalQueries.toArray(new Predicate[0]));
};
}
它没有帮助。似乎它把整个对象都拉起来了。或者可能是我没有以正确的方式使用查询。multiselect。我能找人帮忙吗?
当必须使用规范中的其他字段时,是否有一种方法可以用字段的子列表拉出对象?
显然还没有。您可以在这里阅读https://stackoverflow.com/a/42049307/12854146
如果需要,您可以使用标准jpa来实现您需要的功能
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
private static class ReferralDTO {
private Long id;
private Date createdDate;
}
private List<ReferralDTO> findAllByCurrentContact(Contact currentContact) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<ReferralDTO> criteria = builder.createQuery(ReferralDTO.class);
Root<Referral> referral = criteria.from(Referral.class);
//projection
criteria.select(builder.construct(ReferralDTO.class, referral.get("id"), referral.get("createdDate")));
//where
criteria.where(
builder.equal(referral.get("anotherObject1").get("field1"), currentContact.getId()),
builder.equal(referral.get("anotherObject2").get("field5"), currentContact.getJeta()));
//if you need sorting invoke criteria.orderBy()
TypedQuery<ReferralDTO> query = entityManager.createQuery(criteria);
//if you need pagination invoke query.setFirstResult and query.setMaxResults
return query.getResultList();
}
如果有一种方法我可以用JPA做到这一点,请帮助我! 提前致谢
我有以下实体: 我想在JPQL中执行以下查询: 但我一直有错误如下 无法准备声明;SQL[选择计数(独立)作为COLU_0_u0_u从座位座位0_u开始,座位可用率可用率1_u,费率2_u其中座位0_u。标识符=availabler1。座位标识和可用座位1。可用率标识符=率2。标识符和=坐下。性能(标识符);嵌套的异常是org。冬眠例外SQLGrammarException:无法准备语句 我怎样才
我有以下@query,这是非常好的工作。但是现在我有一个场景,其中there screen需要一个过滤器,这将向查询添加一些where子句。
我们可以通过在存储库接口中编写自定义@Query方法来选择特定列。但是,我不想为不同的属性编写这么多方法。 我试过这个,但它一直返回整个对象。 用作: 这是正确的方法吗?错在哪里?
你可以选择要导出的字段。在默认情况下,列表中所有字段都已选择。如果你不想导出某些字段,首先取消勾选“全部字段”选项,然后在列表中取消勾选那些字段。 【注意】导出查询结果时,向导会将会跳过这个步骤。
我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件