1
我希望能够创建一个对象,分配一个值,将它传递给休眠,并获取完全填充的对象。如果这有所作为,我在注释中使用hibernate。什么例子,我想这样做:有没有办法通过Hibernate的一个对象(genaric)填充任何字段,并让它返回所有填充字段的对象列表?
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<>();
}
这是在休眠存在或有其他库,我可以用一个功能?我一直在阅读一些文档,并看了一些教程,但还没有找到以这种方式访问数据的例子。任何帮助,将不胜感激。谢谢。
编辑:这是我目前在做什么......
/**
* 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;
}
credit - 我发现很多这个在这个线程的评论http://stackoverflow.com/questions/14977018/jpa-how-to-get-entity-based-on-field-value-other-than -id – maxl
您应该查看Hibernate条件。 – AHungerArtist
@AHungerArtist - 不幸的是,标准不适用于我所能找到的仿制药。 – maxl