如何使用条件生成器处理一对多关系中的空值.
我正在使用我的API中的标准构建器来获得结果.
我面临的问题是,当我传递student_group
表中的任何可用文本时,我都会得到结果.当我给出NULL,所以我在student
表中的lastRollResult为NULL时,我得到的是结果,但当我同时传递文本和NULL的组合时,我得不到结果.
我的API是这样的
Http://localhost:8080/student?query=grade:5,最后滚动结果%40成功%23失败
在这种情况下,我能够获得数据
Http://localhost:8080/student?query=grade:5,lastRollResult%空
在这种情况下,我无法获取数据
下面是我正在try 的内容以及我的代码的外观.
我的控制器.
控制器类:
@RequestMapping(method = RequestMethod.GET)
public Page<StudentDTO> index(MySpecificationsBuilder builder,
@PageableDefault(value = 25, page = 0) Pageable pageable) {
Specification<Student> spec = builder.build();
Page<Student> stu = studentService.findAll(spec, pageable);
/** here some modification on retuen */
}
您可以注意到,在控制器中,我正在构建MySpecificationsBuilder,其中设置了所有条件.以下是有关MySpecificationsBuilder的简要信息
public class MySpecificationsBuilder extends BaseSpecification<Student> {
public MySpecificationsBuilder(final SearchCriteria criteria) {
super(criteria);
}
@Override
protected Expression<String> getPath(SearchCriteria criteria, Root<Student> root) {
/** some other conditions */
if (criteria.getKey().equals("lastRollResult")) {
if (!"null".contains(criteria.getValue())) {
Join results = root.join("lastRoll", JoinType.INNER); // In case of text (JoinType.INNER is enum of Inner.
return results.get("result");
}else{
return root.get("lastRoll”); // in case of null
}
}
return root.get(criteria.getKey());
}
/** below toPredicate methods */
}
在MySpecificationsBuilder中,我正在做一些其他的计算,如resultConstant和toPredicate.
在这里,您可以看到,对于文本,我执行的是内部连接,但是在空值的情况下,我直接获取数据.这就是我得到这种回应的原因.如何修复此值.
以下是我的表格详细信息.
@Entity
@Data
@DiscriminatorFormula("case when entity_type is null then ‘Student’ else entity_type end")
@DiscriminatorValue("Student")
public class Student extends AbstractStudent {
@ManyToOne
@Fetch(value = FetchMode.SELECT)
@JoinColumn(name = "created_by_id", insertable = false, updatable = false)
@EqualsAndHashCode.Exclude
@ToString.Exclude
@NotFound(action = NotFoundAction.IGNORE)
User createdBy;
@Transient
private String name;
@Transient
private List<String> tags;
}
和AbstractStudent
@RequiresAudit
@Log4j2
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Data
@Entity
@Table(name = "student_group")
@DiscriminatorColumn(name = "entity_type", discriminatorType = DiscriminatorType.STRING)
public class AbstractStudent extends BaseModel {
@OneToMany(mappedBy = "student", fetch = FetchType.LAZY)
@EqualsAndHashCode.Exclude
@ToString.Exclude
List<StudentMapping> studentMappings;
@OneToMany(mappedBy = "student", fetch = FetchType.LAZY)
@EqualsAndHashCode.Exclude
@ToString.Exclude
List<StudentDataMapping> studentDataMapping;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@AuditColumn
@Column(name = "last_roll_id")
private Long lastRollId;
@OneToMany(mappedBy = "student", fetch = FetchType.LAZY)
@EqualsAndHashCode.student
@ToString.Exclude
private Set<TagUse> tagUses;
@ManyToOne
@Fetch(value = FetchMode.SELECT)
@JoinColumn(name = "last_roll_id", referencedColumnName = "id", insertable = false, updatable = false)
@EqualsAndHashCode.Exclude
@ToString.Exclude
@NotFound(action = NotFoundAction.IGNORE)
private Result lastRoll;
/** some other column defination */
}
在我的摘要列中,你可以有一对一的映射.
是否有任何解决方案,如组或任何where子句或任何其他东西,我可以俱乐部这两个参数,以获得结果为null以及文本.