通过spring-data-jpa进行复杂对象查询

建立数据库表
person表

idsexnamecountry_id
1张三1
2李四1

country表

idname
1中国
2美国

role表

idnameperson_id
1教师1
2学生2
3司机1

从表的内容可以看出person与role是一对多的关系,例如张三可以同时是教师与司机。person与country是多对一的关系,例如张三与李四都是中国人。

创建Person实体类

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;

/**
 * 复杂对象测试实体
 * person - country  多对一
 * person - role  一对多
 * Created by shiyufeng on 2017/2/14.
 */
@Entity
@Table(name = "person")
public class Person implements Serializable {
    @Id
    private String id;

    @Column
    private String name;

    @Column
    private String sex;

    /*
    * cascade:为级联操作,里面有级联保存,级联删除等,all为所有
    * fetch:加载类型,有lazy和eager二种,
    *   eager为急加载,意为立即加载,在类加载时就加载,lazy为慢加载,第一次调用的时候再加载,由于数据量太大,onetomany一般为lazy
    * mappedBy:这个为manytoone中的对象名,这个不要变哦.指向的是要关联的属性,而不是要关联的类
    * Set<role>:这个类型有两种,一种为list另一种为set
    */
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
    private List<Role> roles;

    @ManyToOne
    @JoinColumn(name = "country_id")
    private Country country;

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getSex() {
        return sex;
    }

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

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

创建Role实体类

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import java.io.Serializable;

@Entity
public class Role implements Serializable {
    @Id
    private String id;

    @Column
    private String name;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "person_id")
    private Person person;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Role{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

创建Country实体类

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Created by shiyufeng on 2017/2/15.
 */
@Entity
@Table(name = "country")
public class Country implements Serializable{
    @Id
    private String id;
    @Column
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Country{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

创建PersonRepository数据库访问接口继承之前的BaseRepository通用Dao(BaseRepository中写好了基本的增删改查接口。也可以不继承,自己自定义接口)。

public interface PersonRepository extends BaseRepository<Person, String> {
    public Person findByName(String name);
}

创建服务控制类ComplexEntityController

import cn.entity.Country;
import cn.entity.Person;
import cn.entity.Role;
import cn.service.PersonRepository;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 复杂对象测试用例
 * Created by shiyufeng on 2017/2/14.
 */
@Transactional // 事务
@RestController
@EnableAutoConfiguration
@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
public class ComplexEntityController {

    @Resource
    private PersonRepository personRepository;

    /**
     * person - country  多对一
     * person - role  一对多
     *
     * @return
     */
    @RequestMapping("/findPerson")
    public String findPerson() {
        Person person = personRepository.find(Person.class, "2");
        System.out.println(person);
        System.out.println(person.getCountry());
        List<Role> roles = person.getRoles();
        for (Role role : roles) {
            System.out.println(role);
        }
        return "success!";
    }
}

启动服务,通过访问localhost:8080/findPerson即可得到person的信息。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值