【问题标题】:JPA Specification filtering nested objectJPA 规范过滤嵌套对象
【发布时间】:2019-01-29 19:18:04
【问题描述】:

我正在尝试获取嵌套对象属性,但得到了非法参数异常。

AuditTestingPlanSpecification name = new AuditTestingPlanSpecification(new SearchCriteria("auditPlanId.auditPlanEntity", ":",dates));
        Page<AuditTestingPlanMaster> a = auditTestingPlanMasterRepository.findAll(name, ten);

请在下面找到代码,

public class AuditTestingPlanSpecification implements Specification<AuditTestingPlanMaster> {    
private SearchCriteria criteria;

    public AuditTestingPlanSpecification(SearchCriteria searchCriteria) {
        this.criteria = searchCriteria;
    }

    @Override   
    public Predicate toPredicate(Root<AuditTestingPlanMaster> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

        if (root.get(criteria.getKey()).getJavaType() == String.class) {
            return builder.like(root.<String>get(criteria.getKey()), "%" + criteria.getValue().get(0).toString() + "%");
        } else {
            return builder.equal(root.get(criteria.getKey()), criteria.getValue().get(0).toString());
        }

        return null;
    }
}

类 SearchCriteria.java

public class SearchCriteria {
    public SearchCriteria(String key, String operation, List<Object> value) {
        super();
        this.key = key;
        this.operation = operation;
        this.value = value;
    }
    private String key;
    private String operation;
    private List<Object> value;

    // getters & setters
}

类 AuditTestingPlanMaster.java

@Entity
@Table(name = "audit_testing_plan_master")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class AuditTestingPlanMaster implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "risk_area_id")
    private Long riskAreaId;

    @Column(name = "expected_revert_date")
    private Instant expectedRevertDate;

    @Column(name = "created_date")
    private Instant createdDate;

    @Column(name = "last_modified_date")
    private Instant lastModifiedDate;

    @JoinColumn(name = "audit_plan_id", referencedColumnName = "id")
    private AuditPlanMaster auditPlanId;

//getters & setters
}

类 AuditPlanMaster.java

@Entity
@Table(name = "audit_plan_master")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class AuditPlanMaster implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "remarks", length = 255)
    private String remarks;

    @Column(name = "audit_plan_entity", length = 50)
    private String auditPlanEntity;

    @Column(name = "start_date")
    private Instant startDate;

    @Column(name = "end_date")
    private Instant endDate;

    //getters & setters

}

我想获取 AuditPlanMaster.auditPlanEntity 字符串与提供的过滤器值匹配的所有 AuditTestingPlanMaster 对象。

提前感谢您的时间和帮助。

【问题讨论】:

标签: spring-boot jpa


【解决方案1】:

我遇到了同样的问题,这是我如何处理它的sn-p。我的问题是从内部 usuario 对象访问 id 字段时,在我的情况下,id 就像您的 auditPlanEntity,而 usuario 就像 auditplanMaster:

public static Specification<UsuarioErrorEquipo> usuarioContains(String codigoUsuario) { 
    return (root, query, builder) -> {
        Path<Usuario> u = root.get("usuario");
        return builder.equal(u.get("id"), codigoUsuario);
    };
}

我相信,在你的情况下,它应该是这样的:

Path<AuditPlanMaster> u = root.get("auditPlanId");
return builder.equal(u.get("auditPlanEntity"), "the value you want to compare");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2020-05-06
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多