我希望能够创建一个对象,分配一个值,将其传递给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;
}
您可以参考本教程,它使用会话。获取(类,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个。