Hibernate 3.5 JPA 1.0
注释@OrderBy仅用于列表字段中的一对多或多对多关系。但我希望它用于单个表,应该由表中的某些字段排序。有可能的?还是另一种解决方案?
例如:
SELECT * FROM INTERCHANGE_KEYS order by PANEL_OPTION, KEY_NAME
我不想为每个表编写hql。
答案 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图层类的标准实现)。