有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有一种方法可以通过Hibernate传递一个对象(genaric)并填充任何字段,然后让它返回一个包含所有字段的对象列表?

我希望能够创建一个对象,分配一个值,将其传递给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;
}

共 (1) 个答案

  1. # 1 楼答案

    您可以参考this教程,它使用会话。获取(类,id)。您还可以使用Spring的HibernatreOperationsget方法,它是会话的包装器。获取文档中提到的方法。 基本上也使用HibernateTemplate