Java、Hibernate - 如何创建通用的 getByColumnValue() 方法?
Java, Hibernate - How to create generic getByColumnValue() methods?
我想编写一个通用方法来搜索列值和 returns 现有对象或 type 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
的具体 class,我该如何实现?
有没有更好的方法?
编辑
基于 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();
您甚至可以编写一个方法,通过将列名也传递给方法来查询任意列。
我想编写一个通用方法来搜索列值和 returns 现有对象或 type 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
的具体 class,我该如何实现?
有没有更好的方法?
编辑
基于 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();
您甚至可以编写一个方法,通过将列名也传递给方法来查询任意列。