选择可能的空值的HQL
问题描述:
我有一个类交易。 交易有发件人。 发件人有一个字段'测试'。 transaction.sender可以为null或不是。选择可能的空值的HQL
我试图让所有的交易蒙山发件人= null或sender.test =真
我试着在HQL
select * from Transaction t where ((t.sender is null) or (t.sender.test is true))
select * from Transaction t where ((t.sender is null) or (t.sender.test in (true)))
select * from Transaction t where ((t.sender is null) or (t.sender.test = true))
,我只得到了与“t.sender交易。测试是真实的',我没有得到't.sender为空'的交易。
如果我只尝试:
select * from Transaction t where t.sender is null
我与 't.sender为空'
谁能帮助我的交易?
谢谢
编辑: 我的代码是
StringBuilder q = new StringBuilder("from Transaction t where MONTH(t.dateTransfered) = :month and YEAR(t.dateTransfered) = :year ");
if (Val.required(request.getParameter("test"))){
test = Boolean.valueOf(request.getParameter("test"));
if (test){
q.append("and ((t.sender is null) or (t.sender.test = true))");
}
}
编辑2:
public List<Transaction> get(HttpServletRequest request, Date date, int start, int end) {
StringBuilder q = new StringBuilder("from Transaction t where MONTH(t.dateTransfered) = :month and YEAR(t.dateTransfered) = :year ");
if (Val.required(request.getParameter("niv")))
q.append("and (t.sender.id = :niv or t.receiver.id = :niv) ");
if (Val.required(request.getParameter("status")))
q.append("and t.transactionStatus = :status ");
if (Val.required(request.getParameter("serviceType")))
q.append("and transactionServiceType = :serviceType ");
if (Val.required(request.getParameter("source"))) {
q.append("and transactionSource = :source ");
if (Val.required(request.getParameter("sourceMethod"))) {
q.append("and transactionSourceMethod = :sourceMethod ");
}
}
boolean test = false;
if (Val.required(request.getParameter("test"))){
test = Boolean.valueOf(request.getParameter("test"));
if (test){
q.append("and ((t.sender is null) or (t.sender.test = true))");
}
else{
q.append("and (t.sender.test = false and t.receiver.test = false)");
}
}
else {
q.append("and (t.sender.test = false and t.receiver.test = false)");
}
Query qry = entityManager.createQuery(q + " order by t.dateTransfered desc");
qry.setParameter("month", DateUtil.getRealMonth(date));
qry.setParameter("year", DateUtil.getYear(date));
if (Val.required(request.getParameter("niv")))
qry.setParameter("niv", Long.valueOf(request.getParameter("niv")));
if (Val.required(request.getParameter("status")))
qry.setParameter("status", TransactionStatus.valueOf(request.getParameter("status")));
if (Val.required(request.getParameter("serviceType")))
qry.setParameter("serviceType", TransactionServiceType.valueOf(request.getParameter("serviceType")));
if (Val.required(request.getParameter("source"))) {
qry.setParameter("source", TransactionSource.valueOf(request.getParameter("source")));
if (Val.required(request.getParameter("sourceMethod"))) {
qry.setParameter("sourceMethod", request.getParameter("sourceMethod"));
}
}
qry.setFirstResult(start).setMaxResults(end);
try {
return (List<Transaction>) qry.getResultList();
} catch (NoResultException e) {
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
答
t.sender.test
创建与发送者的隐式内连接。你需要的是左连接。 select *
,顺便说一句,是SQL,而不是HQL。你想要的是
select t from Transaction t
left join t.sender s
where s.id is null or s.test = true
谢谢你的回答。我把SQL代码放在我的问题中,但实际上是HQL。我编辑我的帖子,并把我的真实代码。我赞赏你的答案。你能帮我用你的代码回答吗?它的SQL查询不是固定的,我有一个StringBuilder根据参数 – user3078383 2014-10-28 13:10:03
添加代码我不能在查询中使用左连接,还有左连接的替代吗? – user3078383 2014-10-28 13:12:02
为什么你不能使用左连接?什么阻止你使用它? – 2014-10-28 13:13:36