比如说 ,我有个持久化对象User,User有个属性为areaId存放地区编码,但在前台jqgrid表格中要显示的是地区名称,而查询出来的User对象中是没有地区名称属性的,这个问题该如何处理?尤其是批量查询时怎么把地区名取出来且和User一一对应上?

解决方案 »

  1.   

    如果两者是外键的关系
    那User应该是public class User{
       private String areaid;
       ....
    }而应该是public class User{
       private Area area;
       ....
    }然后直接user.getArea().getAreaName()这样获取地区名称
      

  2.   


    那就在DAO类里进行查找传值吧
    大概例如这样
    User user = xxxxxxx //这里你获取到了User
    String areaid = user.getAreaId();Area area = session.get(Area.class,areaid);然后再从area中获取地区字段~
      

  3.   

    1.外键是可取的(记得缓存)
    2.我也不赞同3楼的写法(但是也是个方法在数据量没有达到这个优化等级时)
    3.万一真到了数据量会因为多一查一个对象而发生效率问题,那就直接在user表里加个areaName也是行的
      

  4.   


    一楼的回答很好,这是多对一,地区为多,用户为一,一个地区可以对应多个用户,这样,你只要在User类中加入Area变量就行,至于一对多,多对一的配置,建议你去看一下这方面的资料,很多的。如果配置是懒加载,更不用担心这个性能问题,懒加载在查询时只会先查出来User,当你需要Area的时候才回去查询。Hibernate查询时,在Session不关闭的情况下,会自动取出area。如果每次查询都需要area的时候,你可以在配置上加入一个fetch条件,指定每次都去查询area。这样Hibernate会自动查询。如果是在做web开发,并且关注性能问题,你可以了解一下OpenSessionInView模式。
      

  5.   

    可以建立map 缓存起来
    查到所有地区key 为id  value 为name
    你有id 在从map.get(id);拿出来
      

  6.   

    我觉得懒加载也不是解决之道,我在表格中批量显示User的来自哪个地区时,不可能说显示areaId,肯定要显示地区名,从area对象中取的话,每条Useer都取一个area对象,懒加载根本就没有意义了。
      

  7.   

    查了一下hibernate的文档,发现了formula这个东东,以前没注意,现在发现可以用它来取数据字典里的东东。
    就是在User里加一个areaName,在hbm配置User时对areaName做如下配置:
    <property name="areaName" formula="(select area_name from area a where  a.area_id=areaId)"/>其中areaId是当前User的属性。
    这样就不用加载整个area对象了。同时User也可以懒加载area。不知道这种做法效率如何
      

  8.   


    你的areaId 是动态传参过去的吗? 还是就是个列名?
      

  9.   

    原来是参数为0  我说的呢、真的蛮强大的、看了看执行的sql 、 是在查询sql的时候加入一个子查询 作为一个临时字段 hibernate的formula 的是很强大以下是hibernate formula的资料  希望能对后来的人有用、参考的网站、
    http://onjava.com/pub/a/onjava/2005/08/03/hibernate.html?page=1   e文版
    http://www.blogjava.net/rosen/archive/2005/09/19/13317.html     翻译后的文字
    http://davidyao.iteye.com/blog/521635     我使用的是@Formula注解 配置的 
    http://solonote.iteye.com/blog/215093     貌似网上转载的都是这篇文章小demo:
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;import org.hibernate.annotations.Formula;
    import org.hibernate.annotations.GenericGenerator;
    @Entity
    @Table(name = "userTable")
    public class User {


    @GenericGenerator(name = "generator", strategy = "native")
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name="cn_id")
    private int id;


    @Column(name="cn_name")
    private String name;

    @Column(name="cr_teacher_id")
    private int teacherId;

    //formula里面的参数是必须要有 () 小括号的  里面的参数是sql语句、 而你要动态传参可以使用当前实体类的某个属性、比如下面teacherId  就是User类里面的属性、
    @Formula("( select t.name from teacherTable as t where  t.id = teacherId  )")
    private String teacherName;//这个字段在数据库中是不存在的
    //setter getter 略


    }