2013-06-26 3 views
3

이 경우 DISTINCT와 최대 절전 모드 기준을 만드는 방법이 SQL이 실행됩니다 때내가 포스트 그레스 쿼리를 생성하는 최대 절전 모드 기준을 사용하고

select DISTINCT name from table1 order by lower(name) asc; 

과 아래에 비슷한 SQL 생성

criteria.addOrder(Order.asc(property).ignoreCase()).setProjection(
          Projections.distinct(Projections.property("name"))); 

을 아래 오류를 제공합니다 :

ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 

나는 이것이 postgres 규칙에 대한 것이지만 w 암탉 내가 오류로 보았다, 나는 우리가 조항에 조항을 사용해서는 안된다는 것을 발견했다. 다음과 같이 선택 중첩

  1. 사용 : select name from (select distinct name from table1) as aliasname order by lower(name) asc;

  2. 이 절에 의해 선택 및 주문 모두에서 낮은 기능을 사용하여 그 다음 사용하는 경우, 우리는 두 가지 작업 방법이 필요합니다.

select DISTINCT lower(name) from table1 order by lower(name) asc;

그래서 수정, 나는 최대 절전 모드 측면으로 솔루션을 선호합니다. 위의 두 개의 sqls 중 하나를 얻을 수있는 기준을 만드는 방법.

  • 중첩 된 선택을하는 기준을 만드는 방법.

  • 또한

    • 동면 또는 DB 측 (에 THER 더 나은 솔루션은, 하드 SQL을 사용하지 않고 createQuery() 또는 HQL 인 순서로 사용되는 기능을 선택 적용해야 조건에서 확인 방법
    • ). 사전에 suggetions에 대한

감사합니다.

+0

이전 질문 http://stackoverflow.com/q/16460070/398670과 크게 관련이있는 것 같습니다. –

+0

안녕하세요 크레이그, 잘 연결됩니다. 내 사전 질문과 관련하여 동의하십시오. 내 custom_sort 함수 대신 lower() 함수를 사용하여 문맥에이 질문을 간단하게하려고합니다.참고로, Order 클래스의 toString()을 재정 의하여 Custom DB 함수를 호출하는 것과 관련된 이전 질문을 해결했습니다. 이 문제를 고집하는가요? 감사 – akhi

답변

1

최근에 동일한 문제가 발생하여 SQLProjection을 사용했습니다. 나는이 게시물이 2 년 전임을 알고 있지만, 하드 코드 된 SQL로 전체 쿼리를 다시 작성하지 않아도되는 솔루션을 가진 다른 게시물을 찾지 못했습니다. 그러면이 쿼리가 실행되는 다른 사용자에게 도움이 될 것입니다. 발행물. 이 솔루션은 여전히 ​​하드 코드 된 SQL을 필요로하지만 최소한입니다.

select distinct lower(this_.name) as name from table1 this_ order by lower(this_.name) asc; 

참고 :

String[] columnAlias = {"name"}; 
criteria.addOrder(Order.asc("name").ignoreCase()).setProjection(Projections.distinct(
Projections.sqlProjection("lower(" + criteria.alias + "_.name) as name", columnAlias, 
Hibernate.STRING as Type[]))); 

다음과 같은 SQL을 생성해야 별도로 명시하지 않는 한, criteria.alias은 기본적으로 '이'로 설정되어 있습니다.