2013-05-09 86 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