3

我有一张dept桌子engfinance记录。它不包含或foo的记录。我有一个休眠查询,它返回与我要查找的内容匹配的记录。看起来像:barbaz

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

查询工作正常,可以做我需要做的事情(查找engfinance)。foo但是,我还需要为不匹配的记录( 、、bar和)打印一条日志消息baz

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

在休眠中有一种简单的方法可以做到这一点吗?

据我所知,唯一的解决方案是使用所有假设值创建一些结构并删除查询找到的内容。

4

5 回答 5

3

正如a_horse_with_no_name 指出的那样,您没有说明您的 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
于 2016-04-22T19:42:20.873 回答
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;
于 2013-05-09T21:57:10.347 回答
0
Select * from dept where dept.name not in (eng, foo, bar, baz, finance)
于 2013-05-09T20:44:57.017 回答
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)

未经测试,只是想给你一个大致的想法,我不太确定我是否理解你的要求。

于 2013-05-09T21:48:54.067 回答
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如果您打算在运行时传入子句的值,查询会更加混乱。

于 2013-05-10T01:47:50.733 回答