Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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
Java 如何在长值中查询空值,而不获取;应为数字,但得到二进制“0”;来自OracleDB?_Java_Oracle_Hibernate_Jpa - Fatal编程技术网

Java 如何在长值中查询空值,而不获取;应为数字,但得到二进制“0”;来自OracleDB?

Java 如何在长值中查询空值,而不获取;应为数字,但得到二进制“0”;来自OracleDB?,java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我正在使用JPQL,希望在长字段中查询空值。但我总是得到一个ORA-00932:不一致的数据类型:期望的数字是二进制的。 正如我所看到的,有很多人对此有问题,但有人对此有解决办法吗 例如,这是查询“从Auftrag a中选择a,其中:id为null或a.id=:id” 稍后,我将使用setParameter(“id”,null)设置id。这在更复杂的查询中用于过滤目的,因此在我们的例子中,null意味着忽略列上的过滤器 谁有主意 亲切的问候 我不知道JPQL的细节,也不知道Oracle如何处理查

我正在使用JPQL,希望在长字段中查询空值。但我总是得到一个ORA-00932:不一致的数据类型:期望的数字是二进制的。 正如我所看到的,有很多人对此有问题,但有人对此有解决办法吗

例如,这是查询
“从Auftrag a中选择a,其中:id为null或a.id=:id”
稍后,我将使用
setParameter(“id”,null)
设置id。这在更复杂的查询中用于过滤目的,因此在我们的例子中,null意味着忽略列上的过滤器

谁有主意


亲切的问候

我不知道JPQL的细节,也不知道Oracle如何处理查询的WHERE条件。但是我敢打赌,WHERE条件的第二部分不是完全被忽略的,而a.id=NULL是问题的根源。除了明显不一致的数据类型之外,像
some_value=NULL
这样的条件可能不会计算为TRUE或FALSE,而是计算为NULL(至少在PostgreSQL上会发生这种情况)

编辑
对于您的特定用例,组合条件
:id为NULL或a.id=NULL
仍能在PostgreSQL上正常工作。但在另一个上下文中,即使
some\u value
为NULL,也不会得到任何
some\u value=NULL的行。因此,我认为为了使代码健壮且易于理解,在任何情况下都应该避免使用类似于
some_value=NULL
的表达式。
结束编辑

在JPQL中,您可以使用

SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
至少这在本机Hibernate HQL中是可能的。在这种情况下,如果
:id
为null,则WHERE条件的第二部分计算结果为FALSE,但整个WHERE条件计算结果为TRUE,这正是您想要的

但对于动态筛选查询,更好的方法是使用JPA2.0 Criteria API,并且仅当查询中的
:id
参数不为空时才将其包含在查询中。同样,我不知道JPA标准的细节,但是对于原生Hibernate标准,这将是

public List<Auftrag> findByFilter(Long id) { 
  Criteria criteria = session.createCriteria(Auftrag.class);
  if (id != null) {
    criteria.add(Restrictions.eq("id", id));
  } // if
  return criteria.list();
}
公共列表findByFilter(长id){
条件=session.createCriteria(Auftrag.class);
如果(id!=null){
标准。添加(限制。等式(“id”,id));
}//如果
返回条件。list();
}

希望有帮助

我也遇到过同样的问题,我通过倒车或侧滑来解决,例如:

SELECT a 
FROM Auftrag a 
WHERE :id is null OR a.id = :id
不起作用,但倒车或侧翼如下:

SELECT a 
FROM Auftrag a 
WHERE a.id = :id OR :id is null
工作得很好。我不明白为什么,但它起作用了。它可能与“短路”有关,但如果为null,则无论如何都会对这两个语句求值。希望有人能解释这一点。

在Oracle(12)中,我找到了一个解决方法,使用TO_NUMBER:

SELECT a FROM Auftrag a WHERE :id is null OR a.id = TO_NUMBER(:id)

联合不适合我。我通过使用一个未使用的值(在我的例子中是-1)来获得正确的筛选,从而修复了这个限制

SELECT a FROM Auftrag a WHERE :id = -1 OR a.id = :id

Auftrag类看起来像什么?此外,SQL语法看起来是错误的(“其中id为null”,而不是“其中:id为null”…),而且,id=null也是错误的逻辑。首先,这不是SQL而是JPQL(有一些细微的区别),如果您想将:id设置为null,并且条件应该返回true,那么您必须写入:id is null。在这种情况下,结果语句将是“null is null”,这是真的,因此第二个条件将被忽略。我不认为第二个条件被完全忽略。我打赌异常是由于将数字a.id与null(:id)进行比较而导致的。请发布此JPQL查询生成的SQL。您应该能够在数据库日志中或使用
hibernate.show_SQL=true
hibernate.format_SQL=true
在hibernate配置中查看SQL。无法在此处发布。评论时间太长,只能对100名及以上声誉的人进行自我回答。我唯一能告诉你的是,你的回答是对的,查询中有一个“=null”条件。但正如我所记得的,这在SQL92中是允许的。第二点toplink可以毫无问题地处理这个问题。还可以看看他使用null来忽略过滤部分。如果:id为null,那么他将得到一个select something where true,这样他就不会有任何筛选器,这就是他想要的。@FlorinGhita:老实说,我不知道SQL标准对
some_value=null
的定义,也不知道Oracle如何处理这个问题,但至少在PostgreSQL 9.1上,它的计算结果为null,而不是true/FALSE。此外,还不能保证在SQL中对类似
TRUE或…
的内容进行短路评估。因此,我认为在任何情况下都应该避免使用这样的表达式。在Oracle中,null=null为false,因此,这不应该是一个问题。@tscho:打赌是不确定的;-)。但你是对的,如果另一个数据库依赖于它,你也不应该使用它。我将在这里详细检查PGSQL的功能。一位同事在几个月前的Hibernate项目中使用了这种过滤方式。在那里工作得很好,性能比使用标准要好得多。即使它们非常复杂,也需要更多的思考来理解代码的这一部分。你知道罗伯特·C·马丁的“干净代码”吗。这是一本非常好的书,他的原则之一就是让你的代码小、简单、高效understandable@MikeO:请不要编辑有关PostgreSQL上的
some_value=NULL
影响的内容。这对我使用WaveMaker 6.7很有效。这是怎么回事?为我工作。如果可能,另一个解决方案是降低(空值)。例如,
:id为null或更低(a.id)=更低(:id)
问题是较旧的问题,请为您的oracle指定版本也谢谢。我在Oracle Database 10g(10.2.0.1.0)中测试过它,效果也不错。我在Oracle 11g中测试过它,效果也不错。非常感谢。