用户登录
用户注册

分享至

hibernate动态传参

  • 作者: 转身的邂逅31548607
  • 来源: 51数据库
  • 2020-10-14

List>,String str,String str这是什么参数?List>的引用变量呢?

class对应的传入值就是类A或者是类B的实例。你确定是这样的?


你先把update×××的参数写清楚再说吧。还有类A和类B是否有共同的父类或接口。

追问:

类A和类B之间毫无关系,你就当做是两张表(table)的hibernate的映射类,只是这两个表之间存在一些相同的字段,如创建人、创建日期、创建机构等。我现在要做的就是要修改这几个字段的值,对应的执行方法为update×××,因为他们都有共同的字段,所以我想对入参做泛型化处理,就是第一个入参,我是否应该写成:public  update×××(List t,String str)。

追答:

你的意思是让一个update方法能同时操作两个类?

既然是用hibernate,为什么update里的参数有List,有String?不应该是entity类么?


还有T只能代表一个类,不可能同时代表两个类。那还不如直接用Object类型,没必要用泛型。

追问:

这个update方法每次只调用一次而已,看传入的是类A的实例还是类B的实例,所以想做成泛型,不是一个方法里面操作两个类的实例。我传入的是类A或者类B的集合,所以需要用到List,你可以理解为批量修改

“那还不如直接用Object类型,没必要用泛型”===请问用Obejct如何实现?

追答:

既然A和B没有任何关系,那么就直接用Object类型,不用泛型。

然后在代码里判断类型,比如Object o,

那么就if(o.getClass() == A.class)

           {

             //XXXXX

           }else if(o.getClass() == B.class)

           {

                 //XXXX

           }

这是最直接的类型鉴定。


我觉得还是你的接口设计的有问题,虽然这样可以解决你的问题,但会留下隐患。

直接用两个update方法就不会有问题了。

追问:

目前的只是过渡做法,后续我会把所有表中涉及到这几个字段赋值的地方剥离出来,考虑使用Spring的AOP方式来实现。

但是你的Object方法会产生很多冗余代码,如果我说我有上百个类,都有这几个字段,那岂不是要写上百次if判断,这样不可取的,我个人建议还是用泛型来解决,但是不清楚怎么写。

追答:

进行反射调用方法,因为相同的字段你也知道了,然后封装到一个共同的实体中,让hibernate保存到表中。


用反射,这样就不需要进行类型判断了,但前提是你那些字段,在你那几百个类中的getter方法名是一致的。

追问:

是的,是一模一样的,但是,具体应该如何实现呢?能否说具体一点。

追答:

List   s;

利用Javabean的内省api


proName指的是方法名,如getName(),那么proName就是"name"。

s.getClass(),s是list里的对象,如果每次调用list里的每个对象类型是一致的话,只需要一次就行


PropertyDescriptor proDescriptor = new PropertyDescriptor(proName, s.getClass());     

ethod methodGetX = proDescriptor.getReadMethod();     // 获取getter方法

Object objx = methodGetX.invoke(s);     //执行getter方法,s是方法的调用者,objx 就是方法的返回值


你拿到返回值了,剩下的就没问题了吧?这里不需要任何类型限制,只需要方法名一致即可。

追问:

算了,我重新发帖吧,追问内容有长度限制,郁闷

http://zhidao.baidu.com/question/367934535741323324.html

用你的方法我想我应该解决了问题了。

追答:

恩,看了你的另一个连接。

按照你的需求就是反射获取setter,调用setter方法就行。


软件
前端设计
程序设计
Java相关