gpt4 book ai didi

java - generic dao methods using hibernate criteria 是错误的,但感觉很对

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:20 25 4
gpt4 key购买 nike

目前我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com