Java JPA标准API-分组依据上的空检查
我需要返回结果数组,其中分组列上的数据可能包含空值,当前跳过这些值,同时我还希望将它们分组 我的实体:Java JPA标准API-分组依据上的空检查,java,sql,jpa,join,criteria-api,Java,Sql,Jpa,Join,Criteria Api,我需要返回结果数组,其中分组列上的数据可能包含空值,当前跳过这些值,同时我还希望将它们分组 我的实体: public class UserEntity { // ... @Basic @Column(name = "username") private String username; } public class ZgloszenieEntity { // ... @ManyToOne @JoinColumn(name = &q
public class UserEntity {
// ...
@Basic
@Column(name = "username")
private String username;
}
public class ZgloszenieEntity {
// ...
@ManyToOne
@JoinColumn(name = "assigned_user_id" )
@OrderBy("username")
private UserEntity assignedUser;
@ManyToOne(targetEntity = InternalStatusEntity.class)
@JoinColumn(name = "internal_status")
@NotAudited
private InternalStatusEntity internalStatus;
}
受影响的代码:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EfficiencyStatusReportDTO> cq = cb.createQuery(EfficiencyStatusReportDTO.class);
Root<ZgloszenieEntity> root = cq.from(ZgloszenieEntity.class);
Join<UserEntity, ZgloszenieEntity> join = root.join("assignedUser");
cq.multiselect(join.get("username")
, root.get("internalStatus").get("description")
, getNumberOfDocOfType(cb, root, "X-1")
, getNumberOfDOcOfType(cb, root, "X-2")
, getNumberOfDocOfType(cb, root, "X-3")
, getNumberOfDocOfType(cb, root, "X-4")
, cb.count(root)
);
cq.groupBy(join.get("username"), root.get("internalStatus").get("description"));
我希望它也能产生这样的结果:
{
"username": "admin@gmail.com",
"internalStatus": null,
"numberOfDoc1": 4,
"numberOfDoc2": 1,
"numberOfDoc3": 5,
"numberOfDoc4": 0,
"sumOfDoc": 10
},
JPA生成的查询:
select userentity1_.username as col_0_0_,
internalst2_.description as col_1_0_,
count(case when zgloszenie0_.form_type='X-1' then 1 else null end) as col_2_0_,
count(case when zgloszenie0_.form_type='X-2' then 1 else null end) as col_3_0_,
count(case when zgloszenie0_.form_type='X-3' then 1 else null end) as col_4_0_,
count(case when zgloszenie0_.form_type='X-4' then 1 else null end) as col_5_0_,
count(zgloszenie0_.uid) as col_6_0_
from zgloszenie zgloszenie0_
inner join user userentity1_ on zgloszenie0_.assigned_user_id = userentity1_.id
cross join internal_status internalst2_
where zgloszenie0_.internal_status = internalst2_.id
and 1 = 1
group by userentity1_.username, internalst2_.description
order by userentity1_.username desc
有没有办法将自动创建的交叉联接更改为考虑空值?试试这个
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EfficiencyStatusReportDTO> cq =
cb.createQuery(EfficiencyStatusReportDTO.class);
Root<ZgloszenieEntity> root = cq.from(ZgloszenieEntity.class);
Join<ZgloszenieEntity, UserEntity> assignedUser = root.join("assignedUser",
JoinType.LEFT);
Join<ZgloszenieEntity, InternalStatus> internalStatus = root.join("internalStatus",
JoinType.LEFT);
cq.multiselect(assignedUser.get("username"),
internalStatus.get("description"),
getNumberOfDocOfType(cb, root, "X-1"),
getNumberOfDOcOfType(cb, root, "X-2"),
getNumberOfDocOfType(cb, root, "X-3"),
getNumberOfDocOfType(cb, root, "X-4"),
cb.count(root)
);
cq.groupBy(assignedUser.get("username"), internalStatus.get("description"));
CriteriaBuilder cb=em.getCriteriaBuilder();
标准查询cq=
cb.createQuery(EfficiencyStatusReportDTO.class);
Root Root=cq.from(zgloszenieeentity.class);
Join assignedUser=root.Join(“assignedUser”,
类型(左);
Join internalStatus=root.Join(“internalStatus”,
类型(左);
cq.multiselect(assignedUser.get(“用户名”),
internalStatus.get(“描述”),
getNumberOfDocOfType(cb,根,“X-1”),
getNumberOfDOcOfType(cb,根,“X-2”),
getNumberOfDocOfType(cb,根,“X-3”),
getNumberOfDocOfType(cb,根,“X-4”),
cb.计数(根)
);
groupBy(assignedUser.get(“用户名”)、internalStatus.get(“说明”);
试试这个
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EfficiencyStatusReportDTO> cq =
cb.createQuery(EfficiencyStatusReportDTO.class);
Root<ZgloszenieEntity> root = cq.from(ZgloszenieEntity.class);
Join<ZgloszenieEntity, UserEntity> assignedUser = root.join("assignedUser",
JoinType.LEFT);
Join<ZgloszenieEntity, InternalStatus> internalStatus = root.join("internalStatus",
JoinType.LEFT);
cq.multiselect(assignedUser.get("username"),
internalStatus.get("description"),
getNumberOfDocOfType(cb, root, "X-1"),
getNumberOfDOcOfType(cb, root, "X-2"),
getNumberOfDocOfType(cb, root, "X-3"),
getNumberOfDocOfType(cb, root, "X-4"),
cb.count(root)
);
cq.groupBy(assignedUser.get("username"), internalStatus.get("description"));
CriteriaBuilder cb=em.getCriteriaBuilder();
标准查询cq=
cb.createQuery(EfficiencyStatusReportDTO.class);
Root Root=cq.from(zgloszenieeentity.class);
Join assignedUser=root.Join(“assignedUser”,
类型(左);
Join internalStatus=root.Join(“internalStatus”,
类型(左);
cq.multiselect(assignedUser.get(“用户名”),
internalStatus.get(“描述”),
getNumberOfDocOfType(cb,根,“X-1”),
getNumberOfDOcOfType(cb,根,“X-2”),
getNumberOfDocOfType(cb,根,“X-3”),
getNumberOfDocOfType(cb,根,“X-4”),
cb.计数(根)
);
groupBy(assignedUser.get(“用户名”)、internalStatus.get(“说明”);
联接中类型的顺序不正确,是向后的。对于其余部分,这是正确的方法。@JLazar0谢谢!我漫不经心地把问题抄了下来。编辑谢谢你!很好,请欣赏。联接中类型的顺序不正确,是向后的。对于其余部分,这是正确的方法。@JLazar0谢谢!我漫不经心地把问题抄了下来。编辑谢谢你!很好用,谢谢。