繁体   English   中英

如何在 Spring Data JPA 投影中处理 nullPointer

[英]How to handle nullPointer in Spring Data JPA projections

如果有一种自定义方法来处理投影创建期间发生的 null 或任何其他异常,是否有任何想法?

在下面的 JPQL 查询中,我试图编写一个自定义对象,但是当 updatedBy 列下没有数据时(它在数据库中为 null) - 然后它内部失败,因为无法进一步处理 null 对象(getUpdatedBy -> getProfile -> getName )。

@Query("select new john.home.com.demo.repository.projections.AgreementType(agreement.name, " +
        "agreement.type, " +
        "agreement.audit.createdBy.profile.name, " +
        "agreement.audit.updateDate, " +
        "agreement.audit.updatedBy.profile.name) from Agreement agreement")
List<AgreementType> findAgreementTypes();

这是我的实体:

协议:

@Setter
@Getter
@NoArgsConstructor
@Entity
@Table(name = "AGREEMENT")
public class Agreement {
    @Id
    @Column(name = "AGREEMENT_ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "TYPE")
    private String type;

    @Embedded
    Audit audit;

嵌入式审计

@Getter
@Setter
@Embeddable
public class Audit {
    @OneToOne
    @JoinColumn(name = "CREATED_BY")
    private SystemProcess createdBy;

    @Column(name = "CREATION_DATE")
    private LocalDate creationDate;

    @Column(name = "UPDATE_DATE")
    private LocalDate updateDate;

    @OneToOne
    @JoinColumn(name = "UPDATED_BY")
    private SystemProcess updatedBy;

系统流程:

@Getter
@Setter
@Entity
@Table(name = "sys_process")
public class SystemProcess {
    @Id
    @Column(name = "PROCESS_ID")
    private Integer id;

    @Column(name = "PROCESS_MSG_TXT")
    private String messageText;

    @OneToOne
    @JoinColumn(name = "PROFILE_ID")
    private SystemProfile profile;

系统简介:

@Getter
@Setter
@Entity
@Table(name = "sys_profile")
public class SystemProfile {
    @Id
    @Column(name = "PROFILE_ID")
    private Integer id;

    @Column(name = "PROFILE_NM")
    private String name;
}

这是我使用的 JPQL 查询,但由于未知原因它不起作用

@Query("select new dan.home.pl.demo.repository.projections.AgreementType(" +
            "agreement.name, " +
            "agreement.audit.createdBy.profile.name, " +
            "case when (agreement.audit.updatedBy is null) then 'Dummy Name' else agreement.audit.updatedBy.profile.name end" +
            ") from Agreement agreement")
    List<AgreementType> findAgreementTypes();

您可以使用 case 语句来实现这里检查文档https://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/ch11.html

就像是

case when agreement.audit is not null then agreement.audit.updatedBy.profile.name end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM