Существует сущность по имени Transaction
, которая имеет два сопоставленных (@OneToOne
) дочерних сущности по именам ServiceTransaction
и OtherFeeTransaction
. Возможность фильтрации с использованием Спецификации для всех полей, но одновременно для дочерних полей сущности.
Объект транзакции:
public class Transaction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "id", updatable = false, nullable = false, columnDefinition = "uuid")
private UUID id;
@Column(name = "txn_id")
private String txnId;
@Column(name = "account_no")
private String accountNo;
@Column(name = "date", nullable = false)
private Date date;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "service_id")
private ServiceTransaction serviceTransaction;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "other_id")
private OtherFeeTransaction otherFeeTransaction;
}
Объект OtherFee:
public class OtherFeeTransaction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "id", updatable = false, nullable = false, columnDefinition = "uuid")
private UUID id;
@Column(name = "other_fee_id")
private UUID otherFeeId;
@Column(name = "type_data_id")
private String typeDataId;
}
Сервисный объект:
public class ServiceTransaction implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "id", updatable = false, nullable = false, columnDefinition = "uuid")
private UUID id;
@Column(name = "parcel_id")
private String cadastreId;
@Column(name = "ba_unit_id")
private String titleId;
}
Спецификация
Predicate service = cb.like(root.<ServiceTransaction>get("serviceTransaction").get("titleId"),
"%" + criteria.getTitleId() + "%");
Predicate other = cb.like(root.<OtherFeeTransaction>get("otherFeeTransaction").get("typeDataId"),
"%" + criteria.getTitleId() + "%");
//works if any one of the predicates is added, but doesn't work if both given like below
predicateList.add(service);
predicateList.add(other);
criteriaQuery.where(cb.and(predicateList.toArray(new Predicate[predicateList.size()])))
.getRestriction();
Если любой из predicate
service
или other
дается в состоянии получить результат, но нет, если оба predicates
заданы.
Даже при попытке с or caluse
это де не работает