it-swarm-ko.tech

예제 및 프로젝션 별 최대 절전 모드 쿼리

간단히 말하면 : 최대 절전 모드는 예를 들어 투영 및 쿼리를 지원하지 않습니까? 이 게시물을 찾았습니다.

코드는 다음과 같습니다.

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

다른 포스터가 말했듯이, 생성 된 SQL은 where 클래스가 y__city 대신 this_.city를 참조하도록합니다.

나는 이미 여러 가지 접근법을 시도하고 이슈 트래커를 검색했지만 이것에 대해 아무것도 찾지 못했습니다.

프로젝션 별칭과 트랜스포머를 사용하려고했지만 작동하지 않습니다.

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

누구든지 예를 들어 투영과 쿼리를 사용 했습니까?

21
Miguel Ping

당신의 사용자 클래스를 볼 수 있습니까? 이것은 아래의 제한 사항을 사용하고 있습니다. 왜 제한이 예제와 실제로 다른지 알 수 없습니다 (예에서 null 필드는 기본적으로 무시된다고 생각합니다).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

나는 alaistToBean을 사용한 적이 없지만 그것에 대해 읽었습니다. 결과를 반복 할 수도 있습니다.

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

필요한 경우 수동으로 사용자를 수동으로 채울 수 있습니다.

문제를 진단하기위한 추가 정보없이 문제를 조사하기가 어렵습니다.

16
Arthur Thomas

개체 속성과 이름이 같은 별칭이 있으면 문제가 발생하는 것 같습니다. 최대 절전 모드는 별칭을 선택하여 SQL에서 사용하는 것 같습니다. 이 문서가 herehere 이라는 문서를 발견했으며 Hibernate 팀이 동의하는지 확실하지 않지만 Hibernate의 버그라고 생각합니다.

어느 쪽이든, 나는 내 경우에 효과가있는 간단한 해결책을 찾았습니다. 귀하의 마일리지가 다를 수 있습니다. 세부 사항은 다음과 같습니다.이 샘플의 코드를 단순화하려고 시도하여 오류 나 오타가 있으면 사과드립니다.

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

이 SQL을 생성 할 것입니다 :

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

오류가 발생했습니다 : Java.sql.SQLException : ORA-00904 : "Y1_": 잘못된 식별자

그러나 "this"를 사용하도록 제한을 변경하면 다음과 같이됩니다 :

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

다음과 같은 SQL을 생성했으며 내 문제가 해결되었습니다.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

그게 다야! 고통스러운 문제에 대한 아주 간단한 해결책. 이 수정 프로그램이 예제 문제로 쿼리로 어떻게 변환되는지 모르지만 더 가까이 갈 수 있습니다.

44
Ryan Cook

여기서 진짜 문제는 where 절에서 select-list aliases를 사용하는 곳에서 최대 절전 모드에 버그가 있다는 것입니다.

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

누군가가 여기에 답을 찾고있을 경우 티켓을 보러 가십시오. 수정하는 데 5 년이 걸렸지 만 이론 상으로는 다음 릴리스 중 하나에있을 것이며 문제가 사라질 것입니다.

6
Dobes Vandermeer

비슷한 문제에 직면하고 있습니다. Query by Example을 사용하고 있으며 사용자 정의 필드를 기준으로 결과를 정렬하려고합니다. SQL에서는 다음과 같은 작업을 수행합니다.

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

명령 순서없이 잘 작동합니다. 내가 가진 것은

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

하지만 내가 추가하면

crit.addOrder(Order.asc("diff"));

org.hibernate.QueryException : 속성을 확인할 수 없습니다 : diff 예외가 발생합니다. this의 해결 방법도 작동하지 않습니다.

추신 : Hibernate에 대한 QBE 사용에 대한 정교한 문서를 찾을 수 없으므로 위의 모든 내용은 주로 시행 착오 방식입니다.

0
VHristov
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);
0
singh