美文网首页我爱编程知识共享
Spring Data JPA 多个实体类表联合视图查询

Spring Data JPA 多个实体类表联合视图查询

作者: 老老戟 | 来源:发表于2018-08-03 20:37 被阅读3次

    Spring Data JPA

    查询数据库时,如果两个表有关联,那么就设个外键,在查询的时候用Specification创建Join

    查询便可。但是只支持左连接,不支持右连接,虽说左右连接反过来就能实现一样的效果,但是这就关系到谁是谁的外键的问题。外键搞起来有时候确实麻烦。所以为了查询个视图,没有找到更好的办法,只好在service层查两次合并起来了。

        @Entity

        @Table(name="tb_user")

        publicclassUserInfoimplements Serializable{

            @Id

            @GeneratedValue(strategy=GenerationType.IDENTITY)

            private Long userId;

            private String userName;

            private String password;

            private String name;

            privateint age;

            private String sex;

            private String email;

            private Date dateOfBirth;

            private String telNumber;

            private String education;

            private String school;

        //    @ManyToOne

        //    @JoinColumn(name="addressId")

        //    private Address address;private Long addressId;

        // getter and setter}

        @Entity

        @Table(name="tb_address")

        publicclassAddressimplements Serializable{

            @Id

            @GeneratedValue(strategy = GenerationType.IDENTITY)

            privateLong addressId;private Long userId

            private String areaCode;

            private String country;

            private String province;

            private String city;

            private String area;

            private String detailAddress;

        // getter and setter

    }

    创建一个类包含UserInfo和Address中的所有属性:

    publicclassViewInfoimplements Serializable{

            private UserInfo userInfo;

            private Address address;

            public ViewInfo(){

            }

            public ViewInfo(UserInfo userInfo){

                Address address =new Address();

                this.userInfo = userInfo;

                this.address = address;

            }

            public ViewInfo(Address address){

                UserInfo userInfo =new UserInfo();

                this.userInfo = userInfo;

                this.address = address;

            }

            public ViewInfo(UserInfo userInfo,Address address){

                this.userInfo = userInfo;

                this.address = address;

            }

        // getter and setter

    }

    接下来就是在DAO层中写自定义查询语句了:

    publicinterfaceUserInfoRepositoryextendsCrudRepository{

            @Query(value="SELECT new com.demo.test.Entity.ViewInfo(u,a)FROM "        + " UserInfo u, com.demo.test.Entity.Address a WHERE u.addressId = a.id) ")

            List findViewInfo();

            @Query("SELECT new com.demo.test.Entity.ViewInfo"        + "(u) FROM UserInfo u WHERE u.addressId IS NULL OR u.addressId NOT IN (SELECT a.id FROM Address a)")

            List findViewInfoLeft();

            @Query("SELECT new com.demo.test.Entity.ViewInfo"        + "(a) FROM Address a WHERE a.id NOT IN (SELECT u.addressId FROM UserInfo u WHERE u.addressId IS NOT NULL)")

            List findViewInfoRight();

        }

    然后在service层中查询各个部分:

    publicvoid summary(){

              System.out.println("=======middle part=======");

              List userInfos = userInfoRepository.findViewInfo();

              for(ViewInfo item : userInfos){

                  System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());

              }

              System.out.println("=======left part=======");

              List userInfoLeft = userInfoRepository.findViewInfoLeft();

              for(ViewInfo item : userInfoLeft){

                  System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());

              }

              System.out.println("=======right part=======");

              List userInfoRight = addressRepository.findViewInfoRight();

              for(ViewInfo item : userInfoRight){

                  System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());

              }

            }

    数据库的Inner Join选交集,Outer Join 选并集,Left Join 选左表与右表的差集加上交集,Right Join选右表与左表的差集加上交集。暂且如此了。如果哪位看到我的文章有更好的方法请不吝赐教。

    相关文章

      网友评论

        本文标题:Spring Data JPA 多个实体类表联合视图查询

        本文链接:https://www.haomeiwen.com/subject/kwiuvftx.html