최대 절전 모드에서 쿼리를 사용하는 맵 엔티티
-
05-07-2019 - |
문제
테이블을 고려하십시오
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;}
}
따라서 주문별 기준 엔진, 제한 등을 사용하려는 이유는 당신이 그것을 사용하고 싶은 이유라고 생각합니다.