2013-05-09 85 views
3

我有一个dept表,其中有engfinance记录。它不包含foobarbaz的记录。我有一个hibernate查询返回符合我要找的记录。它看起来像:在“IN”子句中查找与记录不匹配的值

select * from dept where dept.name in (eng, foo, bar, baz, finance); 

查询工作正常和做什么,我需要做的(发现engfinance)。但是,我还需要打印出日志信息对于那些没有匹配记录(foobarbaz)认为:

log.debug ("could not find records where dept.name in foo, bar, baz"); 

有没有一种简单的方法在Hibernate中做到这一点?

从我所看到的,唯一的解决方案是使所有的假设值的一些结构,并删除查询发现的东西。

回答

0
Select * from dept where dept.name not in (eng, foo, bar, baz, finance) 
+0

但由于没有记录,它应该返回0行不,有foo的酒吧或巴兹没有记录 – 2013-05-09 20:48:41

+0

你能更详细?我很困惑 - 可能会显示一些示例数据和示例输出。 – Randy 2013-05-09 21:00:04

+0

我需要知道“in”子句中哪些内容与任何记录不匹配。你在这里给我的所有记录都不在XXXX中 – 2013-05-09 21:06:14

0

你可以只CONCAT字段名称,并将得到的名单将有什么你想打印的错误:

select 
    dept.name as name, 
    CONCAT(
     case 
      when !eng 
      then 'eng, ' 
      else '' 
     end, 
     case 
      when !foo 
      then 'foo, ' 
      else '' 
     end, 
     case 
      when !bar 
      then 'bar, ' 
      else '' 
     end, 
     case 
      when !baz 
      then 'baz, ' 
      else '' 
     end, 
     case 
      when !finance 
      then 'finance' 
      else '' 
     end) as errorFields 
from dept where dept.name not in (eng, foo, bar, baz, finance) 

未经检验的,只是想给你的总体思路,和IM不相当肯定,如果我undestand你所要求的。

1

你不说出你的DBMS,所以这是ANSI SQL:

with names (dname) as (
    values 
    ('eng'), 
    ('foo'), 
    ('bar'), 
    ('baz'), 
    ('finance') 
) 
select n.dname 
from names as n 
    left join depts as d on d.name = n.dname 
where d.name is null; 
0

老实说,可能会有一些肮脏的把戏做到这使得它看起来像是直接在查询工作,但为什么做查询不可维护,并在数据访问层中放入不必要的业务逻辑?这是非常直接的代码完成。

在伪代码它仅仅是这样的:

List<Department> searchByDeptNames(List<String> deptNames) { 
    List<Department> depts = 
     session.createQuery("from dept where dept.name in (:deptNames)") 
       .setParameter("deptNames", deptNames) 
       .list(); 
    // log down unmatched dept names 
    if (logger.isDebugEnabled()) { 
     Set<String> unmatchedDeptNames = new HashSet<String>(deptNames); 
     for (Department dept : depts) { 
      inputDeunmatchedDeptNames.remove(dept.getName()); 
     } 
     logger.debug("no record found for dept names : " + unmatchedDeptNames); 
    } 
    return depts; 
} 

查询会,如果你打算在运行时in条款的值传递甚至更加杂乱。

2

由于a_horse_with_no_name points out,您没有声明您的DBMS。这是一个SQL Server 2008解决方案:

select input.name 
from (values 
    ('eng'), 
    ('foo'), 
    ('bar'), 
    ('baz'), 
    ('finance') 
)[input](name) 

left join depts d on d.name = input.name 
where d.name is null