首页 > 解决方案 > 如何否定多个谓词

问题描述

我有两个实体

@Entity
@Table(name = SIGNAL")
public class TradingSignal {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false, unique = true)
    private int id;

    @Column(name = "SIGNAL_ID")
    private int signalId;

    @Column(name = "TICKER", length = 6)
    private String ticker;

    @OneToMany(cascade = CascadeType.ALL)
    private Set<TsUsed> tsUsedSet;
}

@Entity
@Table(name = "TS_USED")
public class TsUsed {

    @Id
    @Column(name = "FILTER_ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int filterId;

    @Column(name = "USER_ID_LSB")
    private long userIdLsb;

    @Column(name = "USER_ID_MSB")
    private long userIdMsb;

    @Column(name = "VISIBLE")
    private boolean visible;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ID", nullable = false)
    private TradingSignal tradingSignal;
}

我怎样才能找到所有TradingSignals where TsUseduserIdLsbTsUseduserIdMsb不存在于tsUsedSet

无法创建有效的谓词。

这段代码对我不起作用

    Join<TradingSignal, TsUsed> tsUsed = getTsUsedJoin(root);
    Predicate predicateUserIdLsb = builder.equal(tsUsed.get("userIdLsb"), userId.getLeastSignificantBits());
    Predicate predicateUserIdMsb = builder.equal(tsUsed.get("userIdMsb"), userId.getMostSignificantBits());
    Predicate predicateInvisible = builder.isFalse(tsUsed.get("visible"));

    Predicate notInvisibleForUser = builder.and(predicateUserIdLsb, predicateUserIdMsb, predicateInvisible).not();

标签: javaspring-data-jpapredicatespecifications

解决方案


推荐阅读