Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果实体名称保存在变量中,如何编写hibernate插入查询_Java_Mysql_Spring_Hibernate_Entity - Fatal编程技术网

Java 如果实体名称保存在变量中,如何编写hibernate插入查询

Java 如果实体名称保存在变量中,如何编写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

在我的应用程序中,我遇到了这样一种情况:我需要将一些数据保存到实体中,但实体名称未知,并且保存在变量和实体字段中,其值在列表中。因此,我需要从变量中选择实体名称,并从列表中选择实体字段和数据。 变量是xEntity

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