SQL 쿼리에서 더 적은 수의 열을 사용하여 많은 관계를 가진 엔티티에서 최대 절전 모드 투영

StackOverflow https://stackoverflow.com/questions/1618394

문제

최대 절전 모드 기준을 위해 기본적으로 구축되는 "선택 *"을 피하기 위해 더 작은 SQL을 구축하려고합니다.

"Transformers"를 통해 간단한 필드 (관계 없음)를 사용하면이 SQL을 가질 수 있습니다.

select description, weight from Dog;

안녕하세요,이 엔티티가 있습니다.

@Entity
public class Dog
{
   Long id;
   String description;
   Double weight;
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "person_id", nullable = false)
   Person owner;
}

@Entity
public class Person
{
   Long id;
   String name;
   Double height;
   Date birthDate;
}

내 목표는 이것을 갖는 것입니다.

select description, weight, owner.name from Dog

기준 (및 하위 측정기)으로 이것을 시도했습니다.

Criteria dogCriteria = sess.createCriteria(Dog.class);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("description"), description);
proList.add(Projections.property("weight"), weigth);
dogCriteria.setProjection(proList);

Criteria personCriteria = dogCriteria.createCriteria("owner");
ProjectionList ownerProList = Projections.projectionList();
ownerProList.add(Projections.property("name"), description);    
dogCriteria.setProjection(ownerProList);  //After this line,  debugger shows that the
                                          //projection on dogCriteria gets overriden
                                          //and the query fails, because "name" is
                                          //not a field of Dog entity.

더 작은 SQL, 적은 열을 얻으려면 예측을 어떻게 사용해야합니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

가장 먼저,

select description, weight, owner.name from Dog

유효한 SQL이 아닙니다. 그것은 같은 것입니다

select description, weight, Person.name
 from Dog join Person on Dog.person_id = Person.id

대신에. 둘째, 왜? 당신이 원하는 것을 할 수는 있지만 (아래 참조), 기준 API를 통해 그렇게하는 것은 극도로 장점이며, 당신은 그것을 보여줄 것이 없습니다. 칼럼이 거대한 덩어리가 아니거나 수십만 개의 레코드를 선택하지 않는 한 두 열에 대한 데이터 전송 절약은 무시할 수 있습니다. 두 경우 모두이 문제를 다루는 더 좋은 방법이 있습니다.

누구든지, 기준에 대해 원하는 것을 수행하려면 별명을 통해 링크 된 테이블 (Person)에 가입하고 투영을 지정해야합니다. 기본 상기 별칭을 사용한 기준 :

Criteria criteria = session.createCriteria(Dog.class, "dog")
 .createAlias("owner", "own")
 .setProjection( Projections.projectionList()
   .add(Projections.property("dog.description"))
   .add(Projections.property("dog.weight"))
   .add(Projections.property("own.name"))
 );

위의 설명과 예가 있습니다. 기준 예측 문서. 실행되면 위의 기준은 객체 배열 목록을 반환합니다. a를 지정해야합니다 resultTransformer 결과를 실제 물체로 변환하기 위해.

다른 팁

나는 아직 혼자서 시도하지 않았지만, 당신은 당신의 엔티티 (Pojo)에서 다른 생성자를 사용하고 열을 전달할 수 있다고 생각합니다. 보다 https://www.thoughts-on-java.org/hibernate-best-practices/ 자세한 지침은 "1.2 Pojo"장. 나에게 Altough 이것이 많은 관계에도 효과가 있는지는 아직 명확하지 않습니다. 시도해 볼게요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top