Mik*_*keO 11 java oracle hibernate jpa
我正在使用JPQL,并希望在Long字段中查询空值.但我总是得到一个ORA-00932:不一致的数据类型:预期NUMBER得到了BINARY.正如我所见,有很多人对此有疑问,但有没有人有解决方法呢?
例如,这是查询"SELECT a FROM Auftrag a WHERE :id is null OR a.id = :id"
,稍后我将id设置为setParameter("id", null).这用于更复杂的查询以进行过滤,因此在我们的示例中,null意味着忽略列上的过滤器.
有想法的人吗?
亲切的问候!
在 Oracle (12) 中,我找到了使用 TO_NUMBER 的解决方法:
SELECT a FROM Auftrag a WHERE :id is null OR a.id = TO_NUMBER(:id)
Run Code Online (Sandbox Code Playgroud)
我不知道JPQL的细节以及Oracle如何处理查询的WHERE条件.但我敢打赌,你的WHERE条件的第二部分并没有被完全忽略,a.id = NULL而是导致了这个问题.除了明显不一致的数据类型之外,条件some_value = NULL可能不会评估为TRUE或FALSE而是评估为NULL(至少这种情况发生在PostgreSQL上).
编辑
对于您的特定用例,组合条件:id IS NULL OR a.id = NULL仍然适用于PostgreSQL.但在另一个上下文中,some_value = NULL即使some_value为null ,也不会获得任何行.因此,我认为为了强大且易于理解的代码,some_value = NULL在任何情况下都应该避免表达式.
结束编辑
您可以在JPQL中解决此问题
SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)
Run Code Online (Sandbox Code Playgroud)
至少这可以使用原生Hibernate HQL.在这种情况下,如果:id为null ,则WHERE条件的第二部分的计算结果为FALSE,但整个WHERE条件的计算结果为TRUE,这就是您想要的.
但是对于动态过滤查询,更好的方法是使用JPA 2.0 Criteria API,并且:id只有当参数不为null时才在查询中包含该参数.同样,我不知道JPA Criteria的细节,但是使用原生的Hibernate Criteria
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();
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
我遇到了同样的问题,我通过反转OR侧来解决它,例如:
SELECT a
FROM Auftrag a
WHERE :id is null OR a.id = :id
Run Code Online (Sandbox Code Playgroud)
没有工作,但像这样扭转OR方面:
SELECT a
FROM Auftrag a
WHERE a.id = :id OR :id is null
Run Code Online (Sandbox Code Playgroud)
工作得很好.我不明白为什么,但它的确有效.它可能与"短路"有关,但是在null的情况下,无论如何都要评估这两个语句.希望有人可以解释一下.
| 归档时间: |
|
| 查看次数: |
7199 次 |
| 最近记录: |