有没有一种方法可以将填充了任何字段的对象(genaric)传递给Hibernate,并让它返回填充了所有字段的对象列表



我希望能够创建一个对象,分配一个值,将其传递给hibernate,并返回一个完全填充的对象。如果有区别的话,我会使用带注释的hibernate。我想做的事情的例子:

Person person = new person();
person.setSin("135873546");
try (Session session = sessionFactory.openSession()) {
session.beginTransaction();
//this is what I don't want to have to do:
//List<Person> result = session.createQuery("From Person where sin ='135873546'").list();
//this is what I want to do:
List<Person> result = session.get(person).list();
Person firstPerson = result.get(0);
System.out.println(firstSteve.getName());          // prints "Steve"
System.out.println(firstSteve.getAge());           // prints "38"
System.out.println(firstSteve.getGender());        // prints "Male"
System.out.println(firstSteve.getMaritalStatus()); // prints "Single"
} catch (HibernateException e) {
logger.error("Failed to retrieve object.", e);
return new ArrayList<>();
}

这是hibernate中存在的功能,还是我可以使用其他库?我已经阅读了一些文档,并查看了一些教程,但还没有找到以这种方式访问数据的示例。如有任何帮助,我们将不胜感激。谢谢

编辑:这就是我目前正在做的。。。

/**
* Retrieve and object from the database.
*
* @param <T>    the object type
* @param clazz  the clazz
* @param object the object
* @return return the object
*/
public <T> List<T> retrieveObjectList(Class<T> clazz, T object) {
String tableName = ((Entity) ReflectionUtils.getClassAnnotation(clazz, Entity.class)).name();
Map<String, Object> importantFields = getFields(clazz, object);
String queryString = buildQueryString(tableName, importantFields);
try (Session session = DatabaseHelper.getSession()) {
Query q = session.createQuery(queryString);
setQueryParameters(q, importantFields);
return q.getResultList();
}catch (HibernateException e) {
Util.logger.error("Failed to persist object.", e);
return new ArrayList<>();
}
}
/**
* populate where clauses
*
* @param q the query
* @param importantFields the where clauses
*/
private void setQueryParameters(Query q, Map<String, Object> importantFields) {
for (Map.Entry<String, Object> field : importantFields.entrySet()) {
//Integer must be converterted to double or Hibernate fails to properly identify it. I don't know why.
q.setParameter(field.getKey(), (field.getValue() instanceof Integer)
? ((Integer) field.getValue()).doubleValue()
: field.getValue());
}
}
/**
* Assemble query string
*
* @param tableName the name of the table taken from annotations
* @param importantFields where clauses
* @return the query
*/
private String buildQueryString(String tableName, Map<String, Object> importantFields) {
StringBuilder queryString = new StringBuilder("FROM " + tableName + " ");
Iterator<Map.Entry<String, Object>> iterator = importantFields.entrySet().iterator();
for (int i=0; i<importantFields.size() ; i++) {
Map.Entry<String, Object> next = iterator.next();
queryString.append(i>0 ? " AND " : " WHERE ");
queryString.append(String.format("%s = :%s ", next.getKey(), next.getKey()));
}
Util.logger.info("Composed query string:n" + queryString + "n");
return queryString.toString();
}
/**
* Get list of non-primitive fields
*
* @param clazz the class
* @param object the object
* @param <T> the type
* @return the list of where clauses
*/
private <T> Map<String, Object> getFields(Class clazz, T object) {
Map<String, Object> importantFields = new TreeMap<>();
for (Field member : clazz.getDeclaredFields()) {
try {
member.setAccessible(true);
Object val = member.get(object);
if (!member.getType().isPrimitive() && val != null) {
importantFields.put(member.getName(), val);
}
} catch (Exception e) {
Util.logger.error("Failed to create query.", e);
}
}
return importantFields;
}

您可以参考本教程,它使用session.get(class,id)。您还可以使用Spring的HibernatreOperations get方法,它是文档中提到的session.get方法的包装器。基本上也使用Hibernate模板。

最新更新