选择可能的空值的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 
+0

谢谢你的回答。我把SQL代码放在我的问题中,但实际上是HQL。我编辑我的帖子,并把我的真实代码。我赞赏你的答案。你能帮我用你的代码回答吗?它的SQL查询不是固定的,我有一个StringBuilder根据参数 – user3078383 2014-10-28 13:10:03

+0

添加代码我不能在查询中使用左连接,还有左连接的替代吗? – user3078383 2014-10-28 13:12:02

+0

为什么你不能使用左连接?什么阻止你使用它? – 2014-10-28 13:13:36