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