当前位置: 首页 > 知识库问答 >
问题:

有没有办法传递Hibernate一个对象(genaric)与任何字段填充,并让它返回所有字段填充的对象列表?[重复]

万开畅
2023-03-14

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

云骏奇
2023-03-14

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

 类似资料:
  • 有没有方法(或快捷方式)填充查询的所有字段? 我们以https://graphql.org/swapi-graphql/为例。 但是如果我想填充所有字段(名称、高度等),该怎么办不需要手动输入?

  • 问题内容: 我使用Json.Net这样填充一个类: 上面的结果JSON字符串填充了我的类中的几个属性。稍后我有一个新的JSON字符串,并希望使用其余属性填充相同的类。是否可以使用JSON.NET或方法?我基本上想在上面的代码行中添加/添加到我填充的帐户对象中。 我的课: 问题答案: 是的,您可以使用第二个JSON字符串来填充现有对象的属性。 这是一个例子: 输出: 小提琴:https : //do

  • 我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子

  • 问题内容: 我正在一个数据库项目上,任务之一是在新创建的字段“ institution”中填充“ course_id”字段的第一部分,即“ HarvardX / CB22x / 2013_Spring”。因此,我只需要使用第一部分’HarvardX填充机构字段。如何在MySQL工作台中做到这一点? 问题答案: 您可以使用: 如果还要提取中段和末端部分,则:

  • 作为一项任务,我被要求制作一个Swing GUI。在第一部分中,我创建了一个()对象()。目前所需要的是对所述数组列表进行排序,并将其显示为GUI中的。我制作了一个,当按下它时,它应该进行排序和显示。 但是,一旦按下它将只显示表标题而不显示数组列表中的信息,我应该做什么不同的事情呢?我已经在下面包括了GUI类和main类。

  • 使用Jackson将JSON响应反序列化为DTO。 使用Gson或Jackson反序列化JSON时忽略空字段 他们仍然从那个不规则的JSON对象创建一个对象。 这意味着我需要遍历这个列表,并通过实现一个清理方法删除所有不具有属性“value”的对象。 我的带有Jackson注释的DTO: 给定JSON响应的结果是初始化了3个DTOs,而不是4个。