Java、Hibernate - 如何创建通用 getByColumnValue() 方法?

标签 java hibernate generics types

我想编写一个通用方法,用于搜索列值并返回现有对象或类型 T 的新对象。 T 有一个数据字段 String name 以及相应的 getName()

这不适用于具有名称列的对象:

static public <T> T getByName(Class<T> type, final String name) {
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    List<T> list = session.createCriteria(type).list();
    session.getTransaction().commit();
    session.close();
    for (T entry : list) {
        if (entry.getName().equals(name)) {
            return entry;
        }
    }
    return new Class<T>(name);//or return null and create object in the calling method
}

entry 必须转换为 T 的具体类,我该如何实现这一点? 有更好的方法吗?

编辑

基于 Aaron Digulla 答案的解决方案:

static public <T> T getByName(Class<T> type, final String name) {
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    Query sqlQuery = session.createQuery("from " + type.getName() + " where name = :name");
    sqlQuery.setParameter("name", name);
    @SuppressWarnings("unchecked")
    List<T> entries = sqlQuery.list();
    session.getTransaction().commit();
    session.close();
    if (entries.size() == 1) {
        return entries.get(0);
    }
    return null;
}

最佳答案

您应该使用HQL为此:

Query q = s.createQuery("from " + type.getName() + " where name = :name");
q.setParameter("name", name);
List<T> result = q.list();

您甚至可以编写一个可以通过将列名称传递到方法中来查询任意列的方法。

关于Java、Hibernate - 如何创建通用 getByColumnValue() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28496660/

相关文章:

Java- <T extends Comparable<T>> 的含义?

java - 如何将struts2中的字符集更改为utf-8

java - 测试 spring hibernate dao 和服务层

spring - 如何从实体管理器访问 Hibernate 统计信息?

java - 如何为部署到 WAS 8 的 spring 4/hibernate 4.3 应用程序配置事务管理

c# - 在基类的惰性方法中获取继承类名

swift - 子类化通用类

Java BorderLayout 等尺寸/对齐方式

java - 如何在 web.xml 中添加应用程序上下文

c# - 从泛型类继承时需要 T 的列表或枚举器的建议