Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在“中查找值”;在;与记录不匹配的子句_Sql_Hibernate - Fatal编程技术网

Sql 在“中查找值”;在;与记录不匹配的子句

Sql 在“中查找值”;在;与记录不匹配的子句,sql,hibernate,Sql,Hibernate,我有一个dept表,其中有eng和finance记录。它不包含foo、bar或baz的记录。我有一个hibernate查询,它返回与我要查找的内容匹配的记录。它看起来像: select * from dept where dept.name in (eng, foo, bar, baz, finance); 查询工作正常,完成了我需要它做的事情(查找eng和finance)。但是,我还需要为那些不匹配的记录打印日志消息(foo、bar和baz): log.debug(“在foo、bar、baz

我有一个
dept
表,其中有
eng
finance
记录。它不包含
foo
bar
baz
的记录。我有一个hibernate查询,它返回与我要查找的内容匹配的记录。它看起来像:

select * from dept where dept.name in (eng, foo, bar, baz, finance);
查询工作正常,完成了我需要它做的事情(查找
eng
finance
)。但是,我还需要为那些不匹配的记录打印日志消息(
foo
bar
baz
):

log.debug(“在foo、bar、baz中找不到dept.name所在的记录”);
在hibernate中有没有一种简单的方法可以做到这一点


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

您可以只对字段名称进行合并,结果列表将完全包含您希望打印为错误的内容:

Select * from dept where dept.name not in (eng, foo, bar, baz, finance)
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)

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

你没有说明你的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;

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

在伪代码中,它类似于:

List searchByDeptNames(List deptNames){
列表部门=
session.createQuery(“从dept.name所在的部门(:deptNames)”)
.setParameter(“deptNames”,deptNames)
.list();
//记录不匹配的部门名称
if(logger.isDebugEnabled()){
Set unmatchedDeptNames=新哈希集(deptNames);
适用于(部门:部门){
inputDeunmatchedDeptNames.remove(dept.getName());
}
logger.debug(“未找到部门名称的记录:“+unmatchedDeptNames”);
}
返回部门;
}
如果您打算在运行时在子句中传递
的值,那么查询将更加混乱。

因为您没有声明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

但是,由于没有记录,它应该返回0行,而不是foo-bar或baz没有记录。您能详细说明一下吗?我很困惑-可能会显示一些示例数据和示例输出。?我需要知道“in”子句中哪些内容与任何记录不匹配。你这里有什么是给我所有的记录,不是在xxxxin条款可能或可能不匹配的记录。我需要知道“IN”子句的哪些值与任何记录不匹配