在没有关系的表中排序

时间:2013-04-19 09:59:18

标签: java hibernate jpa hql jpql

Hibernate 3.5 JPA 1.0

注释@OrderBy仅用于列表字段中的一对多或多对多关系。但我希望它用于单个表,应该由表中的某些字段排序。有可能的?还是另一种解决方案?

例如:

SELECT * FROM INTERCHANGE_KEYS order by PANEL_OPTION, KEY_NAME

我不想为每个表编写hql。

1 个答案:

答案 0 :(得分:1)

您可以为在JPA实体上使用的所有常见操作创建界面。此接口必须具有两个泛型。我将举例说明2个动作(persist和findAll),但所有其他动作(merge,delete,find,...)也可以实现。例如:

    public interface JpaDaoBase {
       public void persist(E e);
       public List findAll(String orderProperty, OrderType orderType);
    }

E类应该是JPA实体,K代表用于主键的java类型的属性(例如,Long)。

接口的实现:

public abstract class JpaDaoBaseImpl implements JpaDaoBase {

        protected Class entityClass;

        public JpaDaoBaseImpl() {
            this.entityClass = (Class) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
        }

        @Override
        public void persist(E e) {
             entityManager.persist(e);
        }

        @Override
        public List findAll(String orderProperty, OrderType orderType) {
        return entityManager.createQuery(
         "select o from " + entityClass.getName() + " o orderby " 
                  orderProperty + + " " + orderType.toString(), entityClass)
         .getResultList();
        }
   }

之后,对于实体示例,您可以通过扩展JpaDaoBaseImpl创建DAO ExampleDao的实现,并且您将实现开箱即用的这两种方法。

这是在JPA(Hiberante)项目中创建DAO层的标准方法。如果你使用Spring,你可以使用Spring Data JPA项目(他们有几个Dao图层类的标准实现)。