2011-10-23 2 views
0

DAO를 통해 쿼리를 N 번 실행하는 루프가 있습니다. 내 경우에는 값이 "123456789"인 객체가 있습니다. 첫 번째 턴에서는 특정 테이블에 대한 쿼리를 실행하여 C1 열이 "123456789"와 동일한 모든 레코드를 가져옵니다.SQL 가장 긴 접두사 문자열

두 번째 턴에서는 동일한 테이블에 대한 쿼리를 실행하여 C1 열이 "12345678"과 동일한 모든 레코드를 가져옵니다. 그리고 가장 긴 접두어가있는 레코드를 찾을 때까지 계속합니다.

나는이 쿼리를 여러 번 실행하는 대신, "123456789"문자열을 매개 변수로 사용하고 "123456789"의 가장 긴 접두사 인 C1 레코드를 반환하는 다른 쿼리를 한 번만 실행하는 것이 좋습니다. ". 하지만 나는 Hibernate (가능한 경우)로 그것을하는 방법을 모르거나 다른 해결책이 있다면. MySQL을 사용하고 있습니다.

는 (나는이 post을 검토 한하지만 최대 절전 모드에 있음을 할 수있는 방법이 있는지 알고 싶어.)

답변

2

당신은 같은 SQL을 실행할 수 있습니다 기본적으로

select * from table where 1234567 like concat(c1,'%') order by c1 desc limit 1; 

이됩니다 지정된 매개 변수와 일치하는 SQL에서 반환되는 가장 긴 값을 가져옵니다. 원하는 경우 setMaxResults 대신 제한 및 연산자를 사용할 수 있습니다. || 다음과 같이 열을 연결합니다.

... 
Query query = session.createQuery("from Prefixes where :parameter like Prefixes.prefix || '%' order by Prefixes.prefix desc"); 
query.setParameter("parameter", 1234567); 
query.setMaxResults(1); 
Prefixes p = (Prefixes)query.uniqueResult(); 
... 
+0

답변을 주셔서 감사합니다. 하지만 두 가지 질문이 있습니다. 첫째, concat()과 ||의 사용 사이의 차이점은 무엇입니까? 또한이 HQL 문은 다른 DBMS간에 이식성이 있습니까? –

+0

내가 아는 한, || 최대 절전 모드이기 때문에 그 자체의 기능으로 각 데이터베이스로 변환됩니다. concat가 전달되어 특정 데이터베이스에서 작동합니다. –