2017-01-23 52 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。

相关问题