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



如果有一种方法可以使用自定义方法来处理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

最新更新