JPA规范,联接和多对多

时间:2019-11-18 15:19:20

标签: spring hibernate jpa join

上下文:

我有一个实体Alert,其中包含多个Dangers,并且Danger可以链接到多个Alerts(标准的多对多)

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

    @ManyToMany
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @JoinTable(name = "alert_danger",
               joinColumns = @JoinColumn(name = "alert_id", referencedColumnName = "id"),
               inverseJoinColumns = @JoinColumn(name = "danger_id", referencedColumnName = "id"))
    private Set<Danger> dangers = new HashSet<>();

}

我正在使用JPA规范来请求Alert。我正在尝试findAll包含Danger列表的警报:

return alertRepositoryExtended.findAll(
            Specification
                .where(inStatusList(alertStatuses))
                .and(inDangers(dangersId)));

这是inDangers方法

private static Specification<Alert> inDangers(List<Long> dangers) {
        if (dangers == null || dangers.isEmpty()) {
            return null;
        } else {
            return (root, query, cb) -> {
                Join<Alert, Danger> dangerJoin = root.join("dangers");
                return dangerJoin.get("id").in(dangers);
            };
        }
    }

我的问题:当我过滤一个危险(比如说angerA)时,我得到了所有包含危险A的警报(这很好),但是它们不再包含其他危险。 如果AlertA包含危险A和危险B,则会从过滤危险A的请求中返回她,但不再将其链接到危险B。

我尝试过的事情: 我尝试使用特定的联接(不支持内部联接,右联接)

0 个答案:

没有答案