首页 > 解决方案 > 如何在 Spring Data JPA 投影中处理 nullPointer

问题描述

如果有一种方法可以使用自定义方法来处理 null 或在投影创建期间发生的任何其他异常,有什么想法吗?

在下面的 JPQL 查询中,我正在尝试编写一个自定义对象,但是当 updatedBy 列下没有数据时(它在数据库中为空) - 然后它在内部失败,因为无法进一步处理空对象(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();

标签: javahibernatespring-data-jpa

解决方案


您可以使用 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

推荐阅读