2017-01-23 55 views
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; 
} 
+0

credit - 我發現很多這個在這個線程的評論http://stackoverflow.com/questions/14977018/jpa-how-to-get-entity-based-on-field-value-other-than -id – maxl

+0

您應該查看Hibernate條件。 – AHungerArtist

+0

@AHungerArtist - 不幸的是,標準不適用於我所能找到的仿製藥。 – maxl

回答

0

你可以參考this教程,它採用session.get(類ID)。你也可以使用Spring的HibernatreOperations get方法,它是文檔中提到的session.get方法的一個包裝。 基本上也使用HibernateTemplate。

相關問題