职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1591|回复: 1

使用select new Map按需查询列表信息

[复制链接]
醉倚西风 发表于 2011-8-31 10:29 | 显示全部楼层 |阅读模式
当我们前端需要显示列表时,若需要显示关联表中的某个字段,如:显示学生列表,需要把学生所在的班级名称也显示,一种方法是建个对象,另一种方式把查出来的值放入Map对象中(也可以放入数组或List)。实体如下:
  
@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)   
public class Student implements Serializable {   
  
    private Long id;   
    private String sno;   
    private ClassInfo classInfo;   
    private String sname;   
    private int sex = 1;   
    @DateTimeFormat(iso=ISO.DATE)   
    private Date birthday;   
    private String loves;   
    private String[] lovesTemp;   
    private String studentDesc;   
         @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SeqName")   
    @SequenceGenerator(name="SeqName", sequenceName="SEQ_STUDENT", allocationSize=1)   
    public Long getId() {   
        return id;   
    }   
         @ManyToOne  
    @JoinColumn(name="CID")   
    public ClassInfo getClassInfo() {   
        return classInfo;   
    }  

@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Student implements Serializable {

        private Long id;
        private String sno;
        private ClassInfo classInfo;
        private String sname;
        private int sex = 1;
        @DateTimeFormat(iso=ISO.DATE)
        private Date birthday;
        private String loves;
        private String[] lovesTemp;
        private String studentDesc;
         @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SeqName")
        @SequenceGenerator(name="SeqName", sequenceName="SEQ_STUDENT", allocationSize=1)
        public Long getId() {
                return id;
        }
         @ManyToOne
        @JoinColumn(name="CID")
        public ClassInfo getClassInfo() {
                return classInfo;
        }

  
@Entity  
public class ClassInfo implements Serializable {   
  
    private Long id;   
    private String cname;   
    private int count = 0;   
         @OneToMany(mappedBy="classInfo", fetch = FetchType.LAZY)   
    public Set<Student> getStudents() {   
        return students;   
    }  

@Entity
public class ClassInfo implements Serializable {

        private Long id;
        private String cname;
        private int count = 0;
         @OneToMany(mappedBy="classInfo", fetch = FetchType.LAZY)
        public Set<Student> getStudents() {
                return students;
        }

当HQL是:from Student s join fetch s.classInfo,这条语句会把Student和ClassInfo两个实体的字段全部查出,当需要Student中的某个字段,可以构造一个构造方法,但是用fetch语句就老报错,不用fetch的话,就会每个Student对象再查询ClassInfo对象,造成了N+1次查询。所以后来就想到了用Map对象来封装,HQL语句如下:
select new Map(s.id as id,s.sno as sno, s.classInfo.cname as cname,s.sname as sname,s.birthday as birthday) from Student s ,用这句就查出的列表信息就是按需查找,班级也只要班级名称,不过也可以新建个对象,把这些查出的值放入新建的对象中(也可以用数组或select new List),不知道各位大侠对这种情况下怎么处理的?

秋秋 发表于 2011-8-31 10:29 | 显示全部楼层
推荐链接

20-30万急聘多名天才Java/MTA软件工程师
见证又一个准百万富翁的诞生!
3G培训就业月薪平均7K+,不3K就业不花一分钱!

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-5 06:04 , Processed in 0.119028 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表