休眠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层类的几种标准实现)。