QueryDSL层级实体如何实现父级属性初始化避免空指针异常
QueryDSL单层级关联实体初始化方案
问题场景
需要对如下结构的Dataset实体做查询条件校验:
class Dataset { private Dataset parent; private String name; }
直接使用如下查询条件会触发空指针异常:QDataset.datasetEntity.parent.name.isNotNull();
触发原因是parent属性未初始化时为null,直接调用name属性的校验方法就会抛出NPE。
已知限制:不能递归初始化所有层级的parent节点,否则会触发栈溢出,仅需要初始化一级父节点即可正常执行查询。
解决方案
使用QueryDSL提供的@QueryInit注解,指定需要初始化的关联属性路径即可,示例配置如下:
class Dataset { @QueryInit({"parent.name"}) private Dataset parent; private String name; }
方案说明
@QueryInit注解指定的路径会控制初始化深度,配置parent.name只会初始化一级parent节点的name属性,不会递归初始化parent的父节点,完全规避栈溢出风险- 配置完成后执行查询时parent属性会被预先初始化,不会出现null值,原查询语句即可正常执行不会抛出NPE
内容的提问来源于stack exchange,提问作者michelson
相关产品推荐
相关产品推荐

