Java 如果实体名称保存在变量中,如何编写hibernate插入查询
在我的应用程序中,我遇到了这样一种情况:我需要将一些数据保存到实体中,但实体名称未知,并且保存在变量和实体字段中,其值在列表中。因此,我需要从变量中选择实体名称,并从列表中选择实体字段和数据。 变量是xEntityJava 如果实体名称保存在变量中,如何编写hibernate插入查询,java,mysql,spring,hibernate,entity,Java,Mysql,Spring,Hibernate,Entity,在我的应用程序中,我遇到了这样一种情况:我需要将一些数据保存到实体中,但实体名称未知,并且保存在变量和实体字段中,其值在列表中。因此,我需要从变量中选择实体名称,并从列表中选择实体字段和数据。 变量是xEntity public void saveData(String xEntity,List<Attribute> attributeList) { // hibernate insert query } 下面是每次可能出现在attributeList中的一些值 att
public void saveData(String xEntity,List<Attribute> attributeList) {
// hibernate insert query
}
下面是每次可能出现在attributeList中的一些值
attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"name","value":"Basil"},{"fieldName":"dob","value":"26-11-90"}]
attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"houseName","value":"Ellikkal"},{"fieldName":"postOffice","value":"Chengara"},{"fieldName":"district","value":"Alappy"},{"fieldName":"state","value":"Kerala"}]
attributeList = [{"fieldName":"empId","value":"EMP_123"},{"fieldName":"degree","value":"B.Tech"},{"fieldName":"grade","value":"First class"}]
日期值为字符串日期,应将其格式化为日期类型。下面是属性类
public class Attribute implements Serializable {
private String fieldName;
private String value;
public Attribute() {
super();
// TODO Auto-generated constructor stub
}
public Attribute(String fieldName, String value) {
this.fieldName = fieldName;
this.value = value;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
现在我可以使用hibernate query将数据保存到每个实体吗?如果有人知道,请帮助我。恐怕HQL不支持每个查询插入数据,但您可以使用反射来构建实体或创建本机查询。恐怕HQL不支持每个查询插入数据,但您可以使用反射来构建实体或创建本机查询本机查询。虽然我不知道您为什么要这样做,但如果您没有其他选择,那么您必须在这里使用反射 首先使用类名创建实例。它应该是完整的类名。此外,您的类应该具有默认构造函数
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor();
Object object = ctor.newInstance();
对于需要将类型从字符串转换为日期等的情况,必须获取字段类型并相应地进行转换。字段类型可通过以下方式找到:
declaredField.getFieldType();
现在使用hibernate保存此对象
sessionFactory.getCurrentSession().save(object);
虽然我不知道你为什么要这样做,但是如果你没有其他选择,那么你必须在这里使用反射 首先使用类名创建实例。它应该是完整的类名。此外,您的类应该具有默认构造函数
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor();
Object object = ctor.newInstance();
对于需要将类型从字符串转换为日期等的情况,必须获取字段类型并相应地进行转换。字段类型可通过以下方式找到:
declaredField.getFieldType();
现在使用hibernate保存此对象
sessionFactory.getCurrentSession().save(object);
我不完全确定您的意思,但请查看“JavaSpring反射”和“对象映射”。应该首先定义实体,然后定义与该实体相关的映射。如果它是根据您的需要动态创建的,那么请思考人们为什么要编写实体。代码应该以这样的方式编写,即易于维护。我不完全确定您的意思,但请查阅“Java Spring反射”和“对象映射”。应该首先定义实体,然后定义与该实体相关的映射。如果它是根据您的需要动态创建的,那么请思考人们为什么要编写实体。代码应该以这样的方式编写,即易于维护看起来不错,但您的示例中的参数是什么?以及为什么您在clazz.getConstructor()中使用String.class?如果构造函数有String参数,我已经给出了创建对象的示例代码。如果您只使用默认构造函数,那么您不需要它。。。。请参阅更新的回答我还可以使用declaredField=object.getClass().getDeclaredField(fieldName);declaredField.setAccessible(true);declaredField.set(对象,字段值);在for循环中,我在其中循环attributeList,循环完成后,执行sessionFactory.getCurrentSession().save(object)???是的,你可以这样做。。。只需确保在设置之前将字符串值转换为正确的类型即可。getting java.lang.ClassNotFoundException:Personlooks很好,但您的示例中的参数是什么?以及您为什么在clazz.getConstructor()中使用string.class?如果构造函数有字符串参数,我已经给出了创建对象的示例代码。如果您只使用默认构造函数,那么您不需要它。。。。请参阅更新的回答我还可以使用declaredField=object.getClass().getDeclaredField(fieldName);declaredField.setAccessible(true);declaredField.set(对象,字段值);在for循环中,我在其中循环attributeList,循环完成后,执行sessionFactory.getCurrentSession().save(object)???是的,你可以这样做。。。只需确保在设置之前将字符串值转换为正确的类型即可。getting java.lang.ClassNotFoundException:Person