• SpringBoot中JPA使用动态SQL查询


    https://www.jianshu.com/p/f72d82e90948

    可以重点关注方法二,把原生sql传入数据库去查询

    好处是:更加灵活
    坏处是:拼接sql比较痛苦,也容易出问题,比如拼接的sql某些字段不存在或者拼接后语法不符合sql语句

    package com.aircas.satellitemanagement.jpa;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.persistence.EntityManager;
    import javax.persistence.Query;
    import java.util.List;
    
    @RestController
    @RequestMapping(value = "/user")
    public class UserController {
    
        @Autowired
        LocalContainerEntityManagerFactoryBean entityManagerFactory;
    
        @GetMapping(value = "/all/4")
        public List<User> exec() {
            EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();
            StringBuilder sqljoint = new StringBuilder(300);
            sqljoint.append("SELECT * FROM user");
            String sql = sqljoint.toString();
            em.getTransaction().begin();
    // User是我自己定义的entity bean Query query
    = em.createNativeQuery(sql, User.class); List<User> obj = query.getResultList(); return obj; } }
    package com.aircas.satellitemanagement.jpa;
    
    import lombok.Data;
    import lombok.ToString;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "user")
    @Data
    @ToString
    public class User {
    
        @Id
        private String id;
    
        private String name;
    
        private String startTime;
    
    
    }

    数据库表结构

    查询结果,是get接口,我就直接用浏览器访问了

     

     注意:实际应用中,会比较复杂,一般来说前台会给后台传一些参数比如name=xxx,后台需要去拼接sql语句

    ----------------------------------------------------------------------------------------------------------------------------------------------------------

    在后续的使用中发现 LocalContainerEntityManagerFactoryBean 会有并发问题,然后尝试了直接使用 EntityManager,发现可以用,目前没啥问题,修改后的如下

    package com.aircas.satellitemanagement.jpa;


    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    import javax.persistence.EntityManager;
    import javax.persistence.Query;
    import java.util.List;

    @RestController
    @RequestMapping(value = "/user")
    public class UserController {

    @Autowired
    EntityManager entityManager;

    @GetMapping(value = "/all/4")
    public List<User> exec() {
    StringBuilder sqljoint = new StringBuilder(300);
    sqljoint.append("SELECT * FROM user");
    String sql = sqljoint.toString();
    // User是我自己定义的entity bean
    Query query = entityManager.createNativeQuery(sql, User.class);
    List<User> obj = query.getResultList();
    return obj;
    }


    }
  • 相关阅读:
    【leetcode】525. Contiguous Array
    【leetcode】827. Making A Large Island
    【leetcode】540. Single Element in a Sorted Array
    【leetcode】45. Jump Game II
    2017.11.2 Talk to customers for an hour
    New Concept English three (29)
    New Concept English three (28)
    2017.10.31 Enginer+position+statement
    New Concept English three (27)
    2017.10.30 Epicor -ERP
  • 原文地址:https://www.cnblogs.com/myfrank/p/14667878.html
Copyright © 2020-2023  润新知