当前位置: 首页 > 知识库问答 >
问题:

如何用JPA规范选择字段子集[重复]

凌博实
2023-03-14
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。我能找人帮忙吗?

共有1个答案

栾耀
2023-03-14

当必须使用规范中的其他字段时,是否有一种方法可以用字段的子列表拉出对象?

显然还没有。您可以在这里阅读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方法来选择特定列。但是,我不想为不同的属性编写这么多方法。 我试过这个,但它一直返回整个对象。 用作: 这是正确的方法吗?错在哪里?

  • 你可以选择要导出的字段。在默认情况下,列表中所有字段都已选择。如果你不想导出某些字段,首先取消勾选“全部字段”选项,然后在列表中取消勾选那些字段。 【注意】导出查询结果时,向导会将会跳过这个步骤。

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件