programing

OracleDB에서 "예상 NUMBER but got BINARY"를 가져오지 않고 Long 값의 null을 쿼리하려면 어떻게 해야 합니까?

lastmoon 2023. 7. 21. 21:50
반응형

OracleDB에서 "예상 NUMBER but got BINARY"를 가져오지 않고 Long 값의 null을 쿼리하려면 어떻게 해야 합니까?

JPQL을 사용하고 있으며 Long 필드의 null 값을 쿼리하려고 합니다.하지만 저는 항상 ORA-00932를 받습니다: 일관성 없는 데이터 유형: 예상된 숫자는 이진법을 얻었습니다.제가 본 바와 같이, 이것에 대해 문제가 있는 사람들이 많지만, 이것에 대한 해결책이 있는 사람이 있나요?

예를 들어 이것은 쿼리입니다."SELECT a FROM Auftrag a WHERE :id is null OR a.id = :id"그리고 나중에 나는 ID를 설정할 것입니다.setParameter("id", null).이것은 필터링 목적으로 더 복잡한 쿼리에서 사용되므로, 우리의 경우 null은 열의 필터를 무시하는 것을 의미합니다.

생각나는 사람?

잘 부탁드립니다!

저는 JPQL의 세부 사항이나 오라클이 당신의 쿼리의 WHERE 조건을 어떻게 처리하는지 모릅니다.하지만 당신의 WHERE 상태의 두 번째 부분이 완전히 무시되지는 않을 것이고, 그것은a.id = NULL문제의 원인이 되고 있습니다.겉보기에 일관성이 없는 데이터 유형을 제외하고는 다음과 같은 조건이 있습니다.some_value = NULLTRUE 또는 FALSE로 평가하지 않고 NULL로 평가할 수 있습니다(최소한 PostgreSQL에서는 이러한 현상이 발생함).

편집
특정 용도의 경우 결합된 조건:id IS NULL OR a.id = NULL여전히 Postgre에서 의도한 대로 작동합니다.SQL. 하지만 다른 맥락에서 당신은 어떤 행도 얻을 수 없을 것입니다.some_value = NULL라 할지라도some_valuenull입니다.그래서 저는 강력하고 이해할 수 있는 코드를 위해 다음과 같은 표현을 생각합니다.some_value = NULL어떤 경우에도 피해야 합니다.
편집 종료

당신은 JPQL의 문제를 해결할 수 있을 것입니다.

SELECT a FROM Auftrag a WHERE :id is null OR a.id = COALESCE(:id, -1)

적어도 이것은 네이티브 HQL의 Hibernative Hibernate HQL.이 경우 WHERE 조건의 두 번째 부분은 다음과 같은 경우 FALSE로 평가됩니다.:idnull이지만 전체 WHERE 조건은 TRUE로 평가되며, 이는 사용자가 원하는 것입니다.

그러나 동적 필터링 쿼리의 경우 JPA 2.0 Criteria API를 사용하고 다음을 포함하는 것이 더 나은 접근 방식입니다.:id매개 변수가 null이 아닌 경우에만 쿼리에 포함됩니다.다시 말하지만, 나는 JPA 기준의 구체적인 내용은 모르지만 네이티브 하이버네이트 기준의 경우 이것은

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();
}

도움이 되길 바랍니다.

Oracle(12)에서 TO_NUMBER를 사용하여 해결 방법을 찾았습니다.

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

저도 같은 문제를 겪었습니다. OR을 반대로 하여 해결했습니다. 예를 들어 다음과 같습니다.

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인 경우에는 두 진술 모두 평가됩니다.누군가 이것을 설명할 수 있기를 바랍니다.

COALESCE는 저에게 효과가 없었습니다.필터링을 올바르게 수행하기 위해 사용되지 않는 값(내 경우 -1)을 사용하여 이 제한을 수정했습니다.

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

언급URL : https://stackoverflow.com/questions/8643564/how-can-i-query-a-null-in-a-long-value-without-getting-expected-number-but-got

반응형