Java 如何在Spring数据JPA投影中处理空指针

Java 如何在Spring数据JPA投影中处理空指针,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,有没有办法使用自定义方法来处理null或投影创建过程中发生的任何其他异常 在下面的JPQL查询中,我试图组合一个自定义对象,但当列updatedBy下没有数据时(在数据库中为null),它会在内部失败,因为无法继续使用null对象(getUpdatedBy->getProfile->getName) 嵌入式审计 @Getter @Setter @Embeddable public class Audit { @OneToOne @JoinColumn(name = "C

有没有办法使用自定义方法来处理null或投影创建过程中发生的任何其他异常

在下面的JPQL查询中,我试图组合一个自定义对象,但当列updatedBy下没有数据时(在数据库中为null),它会在内部失败,因为无法继续使用null对象(getUpdatedBy->getProfile->getName)

嵌入式审计

@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();
@Query(“选择new dan.home.pl.demo.repository.projections.AgreementType(”+
“协议名称,”+
“agreement.audit.createdBy.profile.name”+
“当(agreement.audit.updatedBy为null)时,则为'Dummy Name'else agreement.audit.updatedBy.profile.Name end”+
)从协议中删除)
列出findAgreementTypes();

您可以使用case语句来实现这一点 请检查此处的文档

差不多

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

不幸的是,这是有效的,但不是我所期望的。它能够根据具体情况更改记录(smth类似于if a then 1 else 2),但我试图实现的是:如果没有对象(意味着null)-放置伪字符串,否则检索字符串。请看一下描述,我已经添加了我使用的查询,也许你有这样的问题issue@DanilTk检查
Hibernate
文档中关于是的示例,即使这是可能的。语法可在@MartinBG shared文档中找到。案例{操作数}当{test_value}然后{match_result}否则{miss_result}结束
@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 when agreement.audit is not null then agreement.audit.updatedBy.profile.name end