NativeSQLOrder
Native SQL Order
Hibernate의 Criteria에서 Native SQL로 된 Order 구문을 사용하고자 할 때, 아래의 Order의 서브클래스를 사용하면된다.
원래 코드는 http://lists.jboss.org/pipermail/hibernate-issues/2007-August/006747.html 에서 가져온 것인데, 원래 코드를 좀 더 깔끔해보이게 했고, desc(), asc() 메소드를 추가해 두었다.
- import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Order;
import org.hibernate.util.StringHelper;
/**
* Hibernate Native SQL 지원 Order 클래스
*
* criteria.addOrder(NativeSQLOrder.desc("{alias}.itemCount + {alias}.commentCount")) 와 같은 형태로
* 사용하며 {alias}는 Criteria에서 값을 가져오는 클래스의 테이블 alias로 자동 변경된다.
*/
public class NativeSQLOrder extends Order {
private static final long serialVersionUID = 1L;
/** 어차피 쓸데 없는 값이다. */
private final static String USELESS_PROPERTY_NAME = "uselessAnyways";
/** asc 여부 */
private boolean ascending;
/** order by 절에 들어갈 Native SQL */
private String nativeSql;
protected NativeSQLOrder(String nativeSql, boolean ascending) {
super(USELESS_PROPERTY_NAME, ascending);
this.nativeSql = nativeSql;
this.ascending = ascending;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
StringBuilder fragment = new StringBuilder();
fragment.append("(");
fragment.append(nativeSql);
fragment.append(")");
fragment.append(ascending ? " asc" : " desc");
return StringHelper.replace(fragment.toString(), "{alias}",
criteriaQuery.getSQLAlias(criteria));
}
public static Order asc(String sql) {
return new NativeSQLOrder(sql, true);
}
public static Order desc(String sql) {
return new NativeSQLOrder(sql, false);
}
}
Comments (0)