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

标签 java hibernate generics

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

相关文章:

java - 两个 docker 容器之间的通信问题

java - 尝试加载 infinispan 配置文件时出现 FileNotFound 异常

java - 重载有界泛型时,如何返回正确的类型?

c# - 使用派生泛型派生类的实例调用方法

Java参数签名解析

java - 为什么java增量运算符(在较大表达式的一部分)的工作方式不同?

java - JComboBox 让 GUI 消失

java - 从字符串中过滤掉 UUId 编号

java - 我可以将 ZODB 与 Hibernate/JPA 一起使用吗?

java - 嵌套异常是java.lang.StackOverflowError