休眠3.5
JPA 1.0

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

例如:

SELECT * FROM INTERCHANGE_KEYS order by PANEL_OPTION, KEY_NAME


我不想为每个表写hql。

最佳答案

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

    公共接口JpaDaoBase {
       公共无效持续(E e);
       公共列表findAll(String orderProperty,OrderType orderType);
    }


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

并实现接口:

公共抽象类JpaDaoBaseImpl实现JpaDaoBase {

        受保护的class entityClass;

        公共JpaDaoBaseImpl(){
            this.entityClass =(类别)((ParameterizedType)getClass()
            .getGenericSuperclass())。getActualTypeArguments()[0];
        }

        @Override
        公共无效的持续时间(E e){
             entityManager.persist(e);
        }

        @Override
        公共列表findAll(String orderProperty,OrderType orderType){
        返回entityManager.createQuery(
         “从+实体类.getName()中选择o或o orderby”
                  orderProperty + +“” + orderType.toString(),entityClass)
         .getResultList();
        }
   }


之后,对于实体Example,您可以通过扩展JpaDaoBaseImpl来创建DAO ExampleDao的实现,并且这两种方法都将立即实现。

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

10-06 10:06