Header

  1. View current page

    권남이의 스프링노트

Profile_img_60x60_01
51

NativeSQLOrder

Native SQL Order

Hibernate의 Criteria에서 Native SQL로 된 Order 구문을 사용하고자 할 때, 아래의 Order의 서브클래스를 사용하면된다.

 

원래 코드는 http://lists.jboss.org/pipermail/hibernate-issues/2007-August/006747.html 에서 가져온 것인데, 원래 코드를 좀 더 깔끔해보이게 했고, desc(), asc() 메소드를 추가해 두었다.

 

  1. 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);
        }
    }

 

Tags

History

Last edited on 12/11/2007 21:14 by kwon37xi

Comments (0)

You must log in to leave a comment. Please sign in.