2013-04-23 1 views
1

"mytable"테이블에 "name"열이 있습니다. 특정 문자열로 시작하거나 이름의 어딘가에 문자열이있는 모든 행을 쿼리하고 이름으로 시작하는 행이 먼저 오는 방식으로 순서를 지정하고 싶습니다. 단 하나의 쿼리 만 가능합니까?"like"쿼리 두 개가 결합되어 정렬되었습니다.

"공용"을 사용할 수 없습니다. 최대 절전 모드를 사용하고 있으며 지원되지 않습니다. 나는 Hibernate second level 캐시에 의해 캐시되지 않기 때문에 뷰를 사용하지 않기를 바랄 것이다.

+1

왜 당신은 최대 절전 모드가 필요합니까? 왜 JDBC와 SQL은 그것을 관리 할 수 ​​없습니까? 당신이 Hibernate를 사용하고 있다고해서 그것이 모두 또는 아무 것도 제안되어서는 안된다는 것을 의미하지는 않는다. – duffymo

+1

'indexOf ("certainString")' – acdcjunior

+0

dyffymo로 주문을 시도하십시오. 저는 특정 환경에 대한 요구 사항으로 인해 제 한계를 말하고 있습니다. 최대 절전 모드로 두 개의 SQL 쿼리를 사용하거나 뷰를 사용하거나 최대 절전 모드로 원시 SQL로 이동할 수 있지만 내 상황에서는 이상적이지 않습니다. – user979051

답변

0

아마도 이런 식으로 작동 할 수 있습니까? 이 쿼리

  • 에 대한 조합과

    • 간단한 쿼리 자바 일종의 대신, 2 개 쿼리로 수행

      select nvl(mytable1.name, '') || nvl(mytable2.name, '') as name, 
      nvl(mytable1.i, '') || nvl(mytable2.i, '') as i from 
      (select 1 as i, name from mytable where name like ('string%')) mytable1 
      full outer join 
      (select 2 as i, name from mytable where name like ('%string%')) mytable2 
      where (mytable1.name is null or mytable2.name is null) 
      and mytable1.name != mytable2.name 
      order by i, name 
      

      는하지만 난 다음 중 하나를 사용하는 것입니다 생각합니다.

  • 0

    오라클에서 당신은 할 수 있습니다 :

    select * 
        from myTable mt 
    where mt.column like '%TargetString%' 
    order by instr(mt.column, 'TargetString') 
    

    당신이 최대 절전 모드 + 오라클을 사용하는 경우, 그것은 사투리 instr 기능을 지원합니다.

    저는 다른 RDBMS도 Hibernate 사투리에 의해 지원 될 수있는 유사한 기능을 가지고 있다고 믿습니다.

    +0

    MySQL을 사용하고 있습니다. 질문에 태그가 지정되어 있습니다. 그래도 감사합니다. – user979051

    -1

    편집 : 둘 이상의 기준 쿼리를 활용에 대한 혐오감을 가지고 있기 때문에 - 어떤 이유를 - 나는 Order 클래스에 독서 건의 할 것입니다. 그것은 당신이 원하는 것을 당신에게 제공하지 않을 것입니다. 따라서 몇 가지 옵션이 있습니다.

    하나의 옵션은 Hibernate Search을 활용하는 것입니다.

    또 다른 방법은 쿼리에 대해 Hibernate를 활용 한 다음 Collections.sort(...)을 주문하는 것입니다. 여러 쿼리를 사용하지 않음 2) 최대 절전 모드를 사용

    List<MyObject> lstMyObject = ...; 
    Collections.sort(lstMyObject, new Comparator<MyObject>() { 
        @Override 
        public int compare(MyObject o1, MyObject o2) { 
         // Assuming 'argument' is passed to this method and defined as 'final' 
         return o1.getName().startsWith(argument) && o2.getName().startsWith(argument) ? 0 : 
          o1.getName().startsWith(argument) ? -1 : 1; 
        } 
    } 
    

    이 1 귀하의 요구 사항을 만족), 3) 4) 5) 노조 '를 사용하지 않는 뷰를 사용하지 네이티브 SQL을 사용하지 않습니다.

    public List<MyObject> findMyObjects(...) { 
        Criteria queryStartsWith = sf.getCurrentSession().createCriteria(MyObject.class) 
         .add(Restrictions.like("myProperty",nameArgument,MatchMode.START)) 
         .addOrder(Order.desc); 
    
        Criteria queryLike = sf.getCurrentSession().createCriteria(MyObject.class) 
         .add(Restrictions.like("myProperty",nameArgument,MatchMode.ANYWHERE)) 
         .addOrder(Order.desc); 
    
        List<MyObject> lstMyObject = new ArrayList<MyObject>(); 
        for (Object curObject : queryStartWith.list()) 
         if (curObject instanceOf MyObject) 
          lstMyObject.add((MyObject) curObject); 
    
        for (Object curObject : queryLike.list()) 
         if (curObject instanceOf MyObject) 
          lstMyObject.add((MyObject) curObject); 
    
        return lstMyObject; 
    } 
    

    내가 Hibernate는 조건부 주문을 수용 할 확실하지 않다 :


    내 조언은 두 개의 쿼리, 뭔가 등이 될 것입니다. org.hibernate.criterion.Order 클래스는 정직하기에 꽤 제한되어 있습니다.

    네이티브 SQL을 사용하는 것 외에는 내 머리 꼭대기에서 생각할 수있는 유일한 옵션입니다.

    +0

    나는 두 개의 쿼리 접근법을 알고있다. 하나의 루핑과 인스턴스 검사가 모두 불필요하다는 것을 알고있다 .queryStartsWith.list(). add (queryLike.list())가 수행한다. – user979051

    +0

    사과한다. 당신은 당신이 Hibernate를 사용하기를 원했던 두 개의 CriteriaQuery를 사용하기를 원하지 않는다고 지정하지 않았다. 누구든지 다운 받았다면 다른 대답으로 바쁘다. 최소한 이것은 원시 SQL로 되돌리기보다는 * 요청 된 * Hibernate를 활용합니다. – Mike

    관련 문제