2017-12-11 1 views
-1

최대 절전 모드 쿼리를 작성하려고 시도했지만 서버를 통해 최대 절전 모드 쿼리를 생성 할 수 있었지만 매개 변수화 된 쿼리의 매개 변수가 올바르게 바인딩되지 않았습니다. 즉, 23을 바인딩 할 경우 매개 변수 1이지만 매개 변수 3에 바인딩됩니다.Hibernate 쿼리 매개 변수 바인딩이 잘못되었습니다.

왜 이런 일이 발생하는지 알고 싶습니다. 이 문제의 근본 원인을 확인하기 위해 확인해야하는 오류 지점은 무엇이되어야합니까?

EDIT (쿼리가 여기에없는 이유는?)

최대 절전 모드 쿼리 복잡한 일이며, 내가 여기를 게시하는 것은 가능하지 않다. 그래서 제 질문은 일반적인 질문입니다. 다른 사람들이이 문제에 직면했을 때 hibernate가 에러를 던지지 않고 쿼리가 성공적으로 생성되었지만 잘못된 데이터를 잘못된 매개 변수에 바인딩하고 있다는 것을 알고 싶었습니다.

내가 예를 통해 대략적인 아이디어를 제공하려고합니다 -> 당신은 쓰기 예 :

criteria.createAlias("D.A", "a", CriteriaSpecification.LEFT_JOIN, Restrictions.eq("a.delIndc", false)); 
criteria.createAlias("A.B", "ab", CriteriaSpecification.LEFT_JOIN, 
          Restrictions.sqlRestriction("sqlQuery")); 
criteria.createAlias("ab.c", "abc", CriteriaSpecification.LEFT_JOIN, Restrictions.eq("c.dataEntry", "Star Wars")); 
criteria.createAlias("abc.f", "f", CriteriaSpecification.LEFT_JOIN, Restrictions.eq("f.dataExit", "Star Trek")); 

를 쿼리는 (오류가 발생하지) 서버에서 성공적으로 생성되지만를하는 동안 점점 매개 변수 바인딩 :

2017-12-09 12:09:21,396 TRACE [org.hibernate.jdbc.AbstractBatcher] (pool-14-thread-2) preparing statement 
2017-12-09 12:09:21,396 TRACE [org.hibernate.type.BooleanType] (pool-14-thread-2) binding 'false' to parameter: 1 
2017-12-09 12:09:21,396 TRACE [org.hibernate.type.BooleanType] (pool-14-thread-2) binding 'Star Trek' to parameter: 2 
2017-12-09 12:09:21,396 TRACE [org.hibernate.type.BooleanType] (pool-14-thread-2) binding 'Star Wars' to parameter: 3 

을 그래서 대신 매개 변수를 잘못 '스타 워즈'2 매개 변수, 그것은 점점 바인딩 바인딩의 3

간단히 말해서 왜 이런 일이 일어날 지 알고 싶습니다. 이 근본 원인을 찾기 위해 내가해야 할 수표는 무엇입니까? 또한이 문제에 직면 한 경우 문제를 발견 한 방법과 문제를 어떻게 해결 했습니까?

희망 사항을 통해 내 검색어가 더욱 명확 해집니다. 이와 관련하여 더 많은 정보가 필요하시면 도와 주시고 알려주십시오.

+0

이 매개 변수를 사용하여 코드를 제공하는 POJO/모델 클래스에 속성의 이름을 수정했을 수 있습니다 가능성을 될 수있는 query.There에 전달할 값을 제공합니다. – amir110

+0

@Zeromus : 쿼리를 업데이트했습니다. 이것을 봐주세요. –

+0

@ amir110 쿼리를 업데이트했습니다. 제발 봐 –

답변

0

Hibernate에서 매개 변수를 바인딩하는 두 가지 방법 - 위치 매개 변수, 명명 된 매개 변수를 사용할 수 있습니다. 0 위치에서 PARAM이 age을 나타냅니다 1 개 위치에 id 및 PARAM을 나타냅니다 여기

select name from Emp where id=? and age=? 

:

는 쿼리처럼이 있다고. 여기서 param 순서가 중요합니다. 당신이 PARAMS이 이름을 사용하기보다는 자신의 위치를 ​​사용하여 참조하고이 경우 순서는 중요하지 않습니다에

select name from Emp where id=:ID and age=:AGE 

은 여기, 이름 IDAGE를 사용하여 PARAMS을 설정할 수 있습니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 다른 쿼리가 있습니다. 나는 내가 분명하지 않았을지도 모른다라고 생각한다. 그 사과. 업데이트 된 질문을 참조하십시오. –

+0

Criteria API를 사용함에 따라 Hibernate는 당신을 위해 SQL을 생성합니다. Hibernate에 의해 생성 된 실제 SQL을 보려면 show.sql = true를 사용하여 디버깅하면됩니다. –

+0

생성 된 SQL geting을 확인했습니다.내가 원하는대로 생성됩니다. 문제는 바인딩에만 있습니다. –

0

은 당신의 코드와 당신이

+0

나는 이것을 이미 확인했다. pojo/model 클래스를 수정하지 않았습니다. 어쨌든, 그런 일이 일어난다면, 최대 절전 모드는 에러를 발생 시켰을 것이지만 쿼리 생성은 성공적이다. –

관련 문제