2013-09-01 2 views
0

이 쿼리입니다 (두 개의 열을 추가)이 쿼리의 최대 절전 모드 상응하는 무엇입니까?

SELECT id, name, sub1, sub2, sub1 + sub2 AS total 
FROM mytable 
ORDER BY sub1 + sub2 ASC 

내가 여기서 뭘하려고하는 것은 내가 SUB1과 SUB2를 추가하고 결과는 총 지명 될 것입니다 주문 주문에 TOTAL을 사용합니다. 지금까지 내가 함께 왔어요 어떻게 이런 일이이지만 적절한 reults를

sess().createSQLQuery("SELECT *, SUB1+ SUB2 AS TOTAL FROM TRACKS order by TOTAL ").addEntity(Student.class).list(); 

내가 뭘하려고 오전의 최대 절전 모드 또는 쿼리 기준 상응하는 무엇입니까

렌더링되지 않는 이유는 무엇입니까?

+0

mytable이 엔티티의 클래스 이름이라고 가정 할 때, 이것은 유효한 HQL입니다. –

답변

1

가 JPQL에서 그런 작업은하지 않습니다,하지만 당신이 할 수있는 것은 다음과 같이 기본 쿼리를 할 수 있습니다 :

public Double getTotal(){ //Replace Double for the data type you use 
    return sub1 + sub2; 
} 

주문할 수있는 방법 : 같은 게터를

"SELECT * FROM TRACKS order by SUB1+ SUB2" 

을 그리고 만들기 원하는 쿼리.

당신이하려는 일입니까? 나는 당신의 질문을 아주 잘 이해했는지 확신 할 수 없다.

0

두 가지 옵션이있다 : 매핑이나 커스텀 OrderBy 객체가있다.

1) 매핑 : 이제

<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" /> 

, 우리는이 값을 사용하여 다음 Total 자주 사용되는 경우에, 당신은 계산/읽기 전용 특성 (누르라 5.1.11. Property를) 엔터티 매핑을 확장하고 만들 수 있습니다 쉽게 주문 (및 어디서나) :

Criteria criteria = session.createCriteria(MyClass.class); 
... 
criteria.addOrder(Order.asc("total")); 

2) 우리는 여전히 OOP 세계에 있습니다. criteria.addOrder() 작업에는 Order 개체 인스턴스가 필요합니다. 그래서 우리는 Custom one : 'MyOrder'를 전달할 수 있습니다.

:이 방법에 의해 ORDER으로 이제

public class MyOrder extends Order { 
    public MyOrder(String propertyName, boolean ascending) { 
     super(propertyName, ascending); 
    } 

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) { 
     StringBuilder fragment = new StringBuilder(); 
     fragment.append(propertyName); 
     fragment.append(ascending ? " asc" : " desc"); 
     return fragment.toString(); 
    } 
} 

, 우리는 어떤 (유효) SQL 스크립트를 삽입 할 수 있습니다 우리의 경우, 개체가 어떤 유효한 SQL 문을 받아들이고 직접 BY ORDER으로 그것을 주입 될 수있다

Criteria criteria = session.createCriteria(MyClass.class); 
... 
criteria.addOrder(new MyOrder("(sub1 + sub2)", true));