문제

테이블을 고려하십시오

sales (id, seller_id, amount, date)

그리고 여기에서 생성 된 견해가 있습니다 sales 쿼리 사용 SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

total_sales (seller_id, amount)

나는 총 판매를위한 엔티티를 만들고 싶지만 SQL쪽에 대한 견해는 없습니다.

이 엔티티는 쿼리에서 구성됩니다. 내가 찾은 가장 가까운 것은입니다 이것, 그러나 나는 그것을 작동시킬 수 없었다.

로더를 정의하더라도 최대 절전 모드는 엔티티 테이블을 찾고 찾을 수없는 경우 오류가 발생합니다. 테이블을 작성하면 정의 된 이름의 쿼리에서 엔티티를로드하지 않으며 최대 절전 모드 자체가 쿼리 자체를 생성합니다.

@loader를 작동시킬 수있는 방법이 있습니까? 아니면 쿼리를 엔티티에 매핑 할 수있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

그냥 사용하지 않는 이유는 무엇입니까? new 쿼리에서?

select new TotalSales(seller_id, count(seller_id))
from sales
group by seller_id

Seller_ID와 정수를 취하는 생성자가있는 클래스 총살을 작성합니다.


편집하다: Criteria API를 사용하는 경우 AliasToBeanResultTransformer (보다 API 문서). 모든 별칭 이름을 동일한 이름의 속성에 복사합니다.

 List list = s.createCriteria(Sales.class)
  .setProjection(Projections.projectionList()
    .add( Projections.property("id"), "SellerId" )
    .add( Projections.rowCount("id"), "Count" ) )
  .setResultTransformer( 
    new AliasToBeanResultTransformer(TotalSales.class) )
  .list();

그럼 당신의 TotalSales 필요합니다 SellerId 그리고 Count 재산.

다른 팁

Stefan의 답변 외에도 명시적인 HQL 쿼리를 사용할 수도 있습니다.

    SELECT seller_id, SUM(amount) FROM sales GROUP BY seller_id

결과는 자연스럽게 목록에 저장됩니다. 이 데이터 유형이 편리하지 않으면 다음을 수행 할 수 있습니다.

  • 그들과 함께 새로운 총체적 객체를 만듭니다 (Stefan의 대답 사용은 더 좋을 것입니다).
  • 데이터를 저장할 맵을 작성하십시오 (요청에 직접 포함시킬 수도 있음).

맞춤형 로더를 정의하려고 할 수 있습니다. 나는 이것을 사용한 적이 없지만 합리적 인 것 같습니다.

<sql-query name="totalSale">
    <return alias="ts" class="TotalSale" />
    SELECT seller_id as {ts.seller_id}, SUM(amount) as ts.amount 
    FROM sales 
    WHERE seller_id = ?
    GROUP BY seller_id
</sql-query>

Seller_ID의 필터가 필요한지 확실하지 않습니다.

클래스 매핑 에서이 명명 된 쿼리를 참조하십시오.

<class name="TotalSale">
    <id name="seller_id">
        <generator class="increment"/>
    </id>
    <property name="seller_id" />
    <property name="amount" />
    <loader query-ref="totalSale"/>
</class>

거기 있습니다 매뉴얼에 대한 자세한 내용.

또는 코드에서 이름 쿼리를 직접 사용할 수 있습니다.이 방법으로 TotalSale의 매핑이 필요하지 않으며 코드에 쿼리를 쓸 필요가 없습니다. 이름이 지정된 쿼리는 객체를 반환 할 수도 있습니다. 보다 명명 된 쿼리에 대한 세부 사항 문서에서.

이 작업에 대해서만 특정 엔티티만을 원한다면 사용자 정의 속성에서 '공식'을 사용할 수 있습니다.

<class name="SellerSales" table="Sales" lazy="true">
    <id name="SellerId" column="SellerId" type="int">
        <generator class="native" />
    </id>
    <property name="SalesSum" type="float" update="false" insert="false" 
            formula="select SUM(sal.ammount) from sales sal where sal.seller_id = SellerId)" />
</class>

public class SellerSales
{
    public int SellerId {get; set;}
    public float SalesSum {get; set;}
}

따라서 주문별 기준 엔진, 제한 등을 사용하려는 이유는 당신이 그것을 사용하고 싶은 이유라고 생각합니다.

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