Есть две сущности по имени A и B. A и B не отображаются, но сущность B имеет свойство по имени applicationId, которое также существует в сущности A. Я написал спецификацию Jpa для сущности B, которая отлично работает.
@Entity
@Table(name = "b")
public class B implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "id", columnDefinition = "uuid")
private UUID id;
@Column(name = "application_id")
private String applicationId;
@Column(name = "notification_name")
private bType type;
@Column(name = "is_mail_sent")
private boolean isMailSent = false;
@Column(name = "is_report_generated")
private boolean isReportGenerated = false;
}
@Entity
@Table(name = "a")
public class A extends implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "application_id", unique = true)
private String applicationId;
@Column(name = "ref_no", unique = true)
private String refNo;
}
public class BSpecification implements Specification<B> {
private final B criteria;
private transient List<Predicate> predicateList = new ArrayList<>();
public NotificationSpecification(B partyCriteria) {
this.criteria = partyCriteria;
}
@Override
public Predicate toPredicate(Root<B> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
if (StringUtils.hasText(this.criteria.getApplicationId()))
this.predicateList.add(cb.like(root.get("applicationId"), "%" + criteria.getApplicationId() + "%"));
if (!StringUtils.isEmpty(this.criteria.getType()))
this.predicateList.add(cb.equal(root.get("type"), criteria.getType()));
if (StringUtils.hasText(this.criteria.getToEmail()))
this.predicateList.add(cb.like(root.get("toEmail"), "%" + criteria.getToEmail() + "%"));
if (this.criteria.getCreatedDate() != null) {
this.predicateList.add(cb.between(root.get("createdDate"), DateUtil.getStartOrEndOfDay(criteria.getCreatedDate(), true),
DateUtil.getStartOrEndOfDay(criteria.getCreatedDate(), false)));
}
this.predicateList.add(cb.equal(root.get("isReportGenerated"), true));
return criteriaQuery.where(cb.and(predicateList.toArray(new Predicate[predicateList.size()])))
.getRestriction();
}
}
Объект A имеет refNo в качестве другого свойства, которого нет в объекте B, если пользователь хочет выполнить поиск B по refNo из A, что возможно с помощью запроса на присоединение, который был написано в собственном запросе.
select nft from b as nft left join a app on app.application_id=nft.application_id
where app.ref_no='test1';
, но хочу достичь этого с помощью спецификации JPA Criteria Builder, я нашел несколько примеров в LEFT Join, которые только для сопоставленных сущностей, но не смогли найти для сущностей, которые больше не отображаются.