目前我有一个 dao,它使用通用方法和 hibernate 标准来执行我几乎所有的数据访问(我计划稍后为更复杂的事情创建子类),它看起来像这样:
public <T> List<T> getAll(final Class<T> type){
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
return crit.list();
}
public <T> List<T> getFieldEq(final Class<T> type, final String propertyName, final Object value){
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
crit.add(Restrictions.eq(propertyName, value));
return crit.list();
}
但是,HQL 更可取,因为它可以通过数据库/连接进行优化(即参数化查询),而标准 api 必须在运行时进行评估,因此 Restrictions.eq("name", "NimChimpksy")
根本不是错误安全的。
我应该保留通用 dao(只有一个 dao 感觉很好),还是只实现一个通用接口(interface)并在单独的 dao 中为我的每个域对象使用 hql。
最佳答案
坦率地说,假设您的查询如此简单明了,我认为您当前的方法没有任何问题。
通常,至少在我的团队中,选择使用 HQL 还是 Criteria 更像是一种“偏好”。 HQL 看起来更像 SQL,您可以编写更压缩的代码。对于某些开发人员来说,Criteria 看起来更面向对象。
就我而言,我倾向于使用 HQL,因为它允许我为复杂查询编写更短、更清晰的代码(我相信这确实是一个偏好问题)。然而,Criteria 也非常有用,因为它允许我比 HQL 更容易地动态构建查询条件,这是一个非常简单的例子:-
public void doIt(String s1, String s2, String s3){
...
if (/*some s1 condition*/) {
crit.add(Restrictions.eq("s1", s1));
}
if (/*some s2 condition*/) {
crit.add(Restrictions.like("s2", s2 + "%"));
}
if (/*some s3 condition*/) {
crit.add(Restrictions.ne("s3", s3));
}
return crit.list();
}
想象一下,如果您要在 HQL 中做这样的事情,您将不得不动态地动态构建 HQL 查询字符串,这会使代码难以阅读。
关于java - generic dao methods using hibernate criteria 是错误的,但感觉很对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410302/