LEFT JOIN в JPA Спецификация для сущностей, которые не отображаются - PullRequest
0 голосов
/ 28 февраля 2020

Есть две сущности по имени 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, которые только для сопоставленных сущностей, но не смогли найти для сущностей, которые больше не отображаются.

...