zoukankan      html  css  js  c++  java
  • SpringDataJpa多表联查 用Specification动态查询 实现多条件复杂查询及多表联查

    都说SpringDataJpa只适合单表,其实SptringDataJpa的缺陷就是不好优化查询效率,但是如果对用户量小的项目来着,SpringDataJpa还是挺好的。这方面知识还是比较少的,在这里做一个记录。

    我建四个表,把这四个表通过主外键管理。

    enti

    @Data
    @Entity
    @Table(name = "t_a")
    class A{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String aname;
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "b_id")
        private B b;
    }
    @Data
    @Entity
    @Table(name = "t_b")
    class B{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String bname;
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "c_id")
        private C c;
    }
    @Data
    @Entity
    @Table(name = "t_c")
    class C{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String cname;
        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "d_id")
        private D d;
    }
    @Data
    @Entity
    @Table(name = "t_d")
    class D{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String dname;
    }

    建完之后是这样的(模拟开发中的多表)

     数据建好之后去创建对象A的mapper

    public interface AMapper extends JpaRepository<A,Integer> , JpaSpecificationExecutor<A> {
    }

     接下来给四个表添加一条数据,我就简单点儿创了。由于springdatajpa的级联,所以创建a表的数据就会把其他数据也填到对应的表中。

    @SpringBootTest
    class DemoApplicationTests {
    
        @Autowired
        private AMapper mapper;
        @Test
        void contextLoads() {
            D d = new D();
            d.setDname("ddd");
            C c = new C();
            c.setD(d);
            c.setCname("ccc");
            B b = new B();
            b.setC(c);
            b.setBname("bbb");
            A a = new A();
            a.setB(b);
            a.setAname("aaa");
            mapper.save(a);
        }
    
    }

    执行成功后进行一下查询

     然后我们假定一个场景,用d的dname属性去查找a的数据。就用到了连接查询了。

     道理就是上图这个样子的,如果还有什么问题 可以留言给我

  • 相关阅读:
    自然语言处理3.4——使用正则表达式检测词组搭配
    自然语言处理3.3——使用Unicode进行文字处理
    自然语言处理3.1——从网络和硬盘访问文本
    自然语言处理2.3——词典资源
    自然语言处理2.2——条件频率分布
    自然语言处理——NLTK中文语料库语料库
    自然语言处理2.1——NLTK文本语料库
    【转载】使用LFM(Latent factor model)隐语义模型进行Top-N推荐
    Ajax (jquery)实现智能提示搜索框(in Django)
    python操作mysql数据库
  • 原文地址:https://www.cnblogs.com/super-hu/p/12654931.html
Copyright © 2011-2022 走看看