【Hibernate】Hibernate单表查询和多表查询

一、前言

      我们都知道Hibernate是S2SH框架中的持久层的模块。主要是和数据库进行打交道,对数据进行增删改查。在整个框架中也占有很重要的一部分。但是当我们要进行查询的时候,单表还是比较简单的。多表就需要我们用连接来操作。 下面小编就系统的整理一下Hibernate如何查询各种类型表的数据。

二、查询的分类

这里写图片描述

三、实战练习

3.1 准备实体类

这里写图片描述

      假定关系如上如所示:一个部门有多个用户,一个岗位可以有多个用户,一个用户可以在多个岗位。

      User类:

public class User implements Serializable {
    private long uid;
    private String username;
    private String password;
    private String sex;
    private String phone;
    private String email;

    private Department department;  // 一对一

    private Set<Post> posts;   //多对多

    public long getUid() {
        return uid;
    }

    public void setUid(long uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    public Set<Post> getPosts() {
        return posts;
    }

    public void setPosts(Set<Post> posts) {
        this.posts = posts;
    }

}

      Department类:

public class Department implements Serializable {
    private long did;
    private String dname;
    private String description;

    private Set<User> users;  //多对多
    public long getDid() {
        return did;
    }
    public void setDid(long did) {
        this.did = did;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }


}

      Port类:

public class Post implements Serializable {
    private long pid;
    private String pname;
    private String description;

    private Set<User> users;  //多对多

    public long getPid() {
        return pid;
    }

    public void setPid(long pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

}

3.2 单表查询

  • 页面上要显示的字段和数据库字段相比,少。

      例如,我们要获取所有用户的用户id和姓名,我们可以采用获取T_User的所有字段,但是这样效率比较低,下面这种方法是推荐的:

      使用构造函数,把要查询的字段写在构造函数中,当然构造函数可以重载,我们可以写很多个:

public Collection<User> getAllUserInfo(){
    String hql = "select new User(uid,username) from User";
    return this.getHibernateTemplate().find(hql);
}

      对User实体类的改变:添加构造函数

    public User(){

    }

    public User(long uid,String username){
        this.uid=uid;
        this.username=username;
    }
  • 当页面显示和数据库字段差不多的时候

      这个查询是最简单的,直接查询表的所有信息就可以:

public Collection<User> getAllUserInfo(){
    String hql = "from User";
    return this.getHibernateTemplate().find(hql);
}

3.3 多表查询

  • 两张表查询,一个页面显示一个表的信息,点击链接显示另一个表的信息,一对多查询

      比如,实体类中一个部门对应多个员工。

      在一个页面显示所有的部门,点击链接,可以在另一个页面显示对应部门下所有的员工信息。

      当加载第一个页面显示所有部门的时候,后台:直接使用“from Department”。

public Collection<Department> getAllDepartment(){
    String hql = "from Department";
    return this.getHibernateTemplate().find(hql);
}

      注意:因为一对多集合默认的加载是懒加载,所以在执行上面的 from Department ,sql语句的时候,并没有加载用户信息,这样第一个页面只能加载部门的信息了。

      点击链接的时候,后台:”from Department d where d.user.did=?”。

public Collection<Department> getAllUserInfo(Department department){
    String hql = "from Department d where d.user.did=?";
    return this.getHibernateTemplate().find(hql,department.getDid());
}
  • 在一个页面显示两张表的所有信息

      解决方案:使用迫切左外连接

select new UserView(u.username,d.dname) from User u inner join u.department d ;

      另外小编也试过这种方案:拼接表查询

select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as s,Examuser as user where s.id.userId = user.id;
  • 三张及以上的(一对多,多对多)

      解决方案:采用三张迫切左外连接的方式

public Collection<User> getAllUserInfo(Department department){
    String hql = "from User u left join fetch u.department d left join fetch u.posts p";
    List<User> userList = this.getHibernateTemplate().find(hql);
    return new HashSet<User>(userList);
}

      注意:使用这种连接的查询,this.getHibernateTemplate().find(hql)查询出来的结果会有重复的值,可以把他放到set中,set自动排重。然后返回set就可以了。

四、小结

      到这里为止,基本就算是介绍完了,这些操作都是非常经典的,就像是Hibernate原生的操作。没毛病!!所以大家还是要多多的练习,多多操作。查询再一个系统中是占有70%的,所以查询的操作我们一定要熟练于键盘。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
你可以使用 Hibernate 的关联映射来执行多查询。以下是几种常见的方法: 1. 使用 HQL(Hibernate Query Language)进行关联查询:可以使用 HQL 编写一个包含多个实体的查询语句,并使用 JOIN 或 FETCH 关键字来指定关联关系。例如: ```java String hql = "SELECT p FROM Person p JOIN p.address a WHERE a.city = :city"; List<Person> persons = session.createQuery(hql) .setParameter("city", "London") .list(); ``` 2. 使用 Criteria API 进行关联查询:Criteria API 提供了一种面向对象的查询方式,可以通过创建 Criteria 对象来构建查询条件和关联关系。例如: ```java CriteriaBuilder builder = session.getCriteriaBuilder(); CriteriaQuery<Person> query = builder.createQuery(Person.class); Root<Person> personRoot = query.from(Person.class); Join<Person, Address> addressJoin = personRoot.join("address"); query.where(builder.equal(addressJoin.get("city"), "London")); List<Person> persons = session.createQuery(query).getResultList(); ``` 3. 使用注解配置关联关系:可以在实体类中使用注解来配置关联关系,然后使用 Criteria API 或者 HQL 来执行查询。例如: ```java @Entity public class Person { // ... @ManyToOne @JoinColumn(name = "address_id") private Address address; // getters and setters } ``` 这样配置之后,你可以使用 Criteria API 或者 HQL 来进行查询。 这些是 Hibernate 中执行多查询的几种常见方法,你可以根据自己的需求选择适合的方法。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值