java - 如何在 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();
解决方案
您可以使用 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
推荐阅读
- linux - Verify if IP present in file
- python - AttributeError:“列表”对象没有属性“主机”
- webpack - Is there a way to make multiple production builds with webpack?
- java - Activity null object reference
- django - Adding One-To-One field to the default Django user model
- javascript - 是否可以在 node.js 文件和 html/javascript 文件之间共享变量?
- python - 我很困惑为什么返回函数在我的程序的控制台上打印一个值。它不应该返回一个值吗?
- xcode - 使用 Jenkins 自动构建和部署 React Native 应用程序?
- python-2.7 - 找不到 py_module_initializer!在 rust 中构建 python 模块时
- javascript - 试图找出我的代码的问题