簡體   English   中英

對可能為null或不為null的屬性應用限制

[英]Applying Restrictions on an attribute that may or may not be null

以下是偵聽器類的類定義,該類也是數據庫實體。 它與TLS實體有關系。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "LISTENER")
@IdClass(EntityId.class)

public class Listener implements MultitenantEntity, AuditedEntity {

    @Id
    @Column(name = "LISTENER_ID")
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    public String id;

    @Id
    @Column(name = "LISTENER_INSTANCE_ID")
    private String instanceId;

    @OneToMany(mappedBy="listener", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @Fetch(value= FetchMode.SELECT)
    private List<Path> paths;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns ({
        @JoinColumn(name="TLS_NAME"),
        @JoinColumn(name="INSTANCE_ID")
    })
    @Fetch(value=FetchMode.SELECT)
    private TlsDescriptor tlsDescriptor;

    @Embedded
    @Builder.Default private AuditMetadata audit = new AuditMetadata();
}

以下是TLS的類定義,它也是一個數據庫實體:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TLS_DESCRIPTOR")
@IdClass(EntityId.class)
public class TlsDescriptor implements MultitenantEntity, AuditedEntity        {
    @Id
    @Column(name = "TLS_NAME")
    public String id;

    @Id
    @Column(name = "INSTANCE_ID")
    private String instanceId;

    @Column(name = "TLS_PROTOCOL")
    public String tlsProtocol;

    @Column(name = "CIPHERS")
    public String ciphers;

    @Lob
    @Column(name = "CERTIFICATE", nullable = false)
    public String certificate;

    @Lob
    @Column(name = "PRIVATE_KEY", nullable = false)
    public String privateKey;

    @Embedded
    @Builder.Default private AuditMetadata audit = new AuditMetadata();
}

在這里,AuditMetadata是一個類,其中包含諸如createdTimestamp和ModifyedTimestamp之類的屬性,本質上跟蹤與之關聯的對象的創建時間和修改時間。

現在,我編寫了下面的Hibernate查詢,該查詢嘗試為其獲取偵聽器對象:

  1. 在“時間戳記”中提到的時間過去之后,要么更新偵聽器本身

  2. 或者在“時間戳記”中提到的時間過去之后,相關路徑已更新

  3. 或者相關的tlsDescriptor在“時間戳記”中提到的時間過去之后已更新

      public List<Listener> findAll(long timestamp, long now, Pageable pageable) { return super.find(currentSession() .createCriteria(Listener.class, "listener") .createAlias("listener.paths", "path") .add(Restrictions.or( Restrictions.between("audit.modifyTimestamp", new Date(timestamp), new Date(now)), Restrictions.between("path.audit.modifyTimestamp", new Date(timestamp), new Date(now)), Restrictions.between("listener.tlsDescriptor.audit.modifyTimestamp", new Date(timestamp), new Date(now)))) .add(Restrictions.isNotEmpty("listener.paths")), pageable); 

    }

現在的問題是,path是必填字段,而tlsDescriptor是可選字段。 因此,當存在tlsDescriptor時,該查詢工作正常,但如果不存在,則會出現以下錯誤:

org.hibernate.QueryException: could not resolve property: tlsDescriptor.audit.modifyTimestamp of:Listener

我試圖嘗試使用Hibernate的合取,析取,AND和OR語句解決此問題,但此錯誤不斷重復!

對帶有JoinType.LEFT_OUTER_JOIN的tlsDescriptor使用別名(因此,如果相關模型為null,則結果不會為空):

public List<Listener> findAll(long timestamp, long now, Pageable pageable) {
return super.find(currentSession()
                .createCriteria(Listener.class, "listener")
                .createAlias("listener.paths", "path")
                .createAlias("listener.tlsDescriptor", "tls", JoinType.LEFT_OUTER_JOIN)
                .add(Restrictions.or(
                        Restrictions.between("audit.modifyTimestamp", new Date(timestamp), new Date(now)),
                        Restrictions.between("path.audit.modifyTimestamp", new Date(timestamp), new Date(now)),
                        Restrictions.between("tls.audit.modifyTimestamp", new Date(timestamp), new Date(now)))),
        pageable);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM