JPA结合querydsl使用

  • Post author:
  • Post category:其他



目录


依赖


配置连接数据库


写实体类


如果出现Cannot resolve table ‘XXX’


Repository层


控制层




不使用分页


使用分页








通过save更改


自己写sql语句


联表查询


自动生成(增加,修改)日期


整合querydsl


依赖


生成Q类


Repository继承qsl


实例


依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

配置连接数据库

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/vueblog?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=****
spring.datasource.password=****
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

写实体类

因为属于严格ORM,所以一定要一一对应。

目前先这样,后边会进行

联表查询、时间自动写入

/**
 * @author 刘通
 * @date 2022年01月15日 20:44
 */
@Entity
@Table(name = "m_blog")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Mblog {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "user_id")
    private int userId;
    @Column(name = "title")
    private String title;
    @Column(name = "description")
    private String description;
    @Column(name = "content")
    private String content;
    @Column(name = "created")
    private Date created;
    @Column(name = "status")
    private int status;
}

/**
 * @author 刘通
 * @date 2022年01月15日 20:25
 */
@Entity
@Table(name = "m_user")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Muser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "username")
    private String username;
    @Column(name = "avatar")
    private String avatar;
    @Column(name = "email")
    private String email;
    @Column(name = "password")
    private String password;
    @Column(name = "status")
    private int status;
    @Column(name = "created")
    private Date created;
    @Column(name = "last_login")
    private Date lastLogin;
}

如果出现Cannot resolve table ‘XXX’

只需要

先用idea连接数据库



选择数据源

就可以了

Repository层

/**
 * @author 刘通
 * @date 2021年09月17日 19:27
 */
public interface TestUserRepository extends JpaRepository<Muser,Integer>, PagingAndSortingRepository<Muser,Integer>, JpaSpecificationExecutor<Muser>{

    
}

控制层


不使用分页

    @Autowired
    TestUserRepository testUserRepository;
    
    @GetMapping("getList")
    public List<Muser> a(){
        List<Muser> all = testUserRepository.findAll();
        return all;
    }

使用分页

    @GetMapping("get")
    public Page<Muser> a(@PageableDefault(size = 10) Pageable page){
        System.out.println("test执行");
        Page<Muser> all = testUserRepository.findAll(page);
        return all;
    }

请求案例:


注意:page从0开始

localhost:8080/get?page=0&size=5


    @PostMapping("add")
    public Muser add(@RequestBody Muser muser){
        testUserRepository.save(muser);
        return muser;
    }


    @PostMapping("delete/{id}")
    public String add(@PathVariable int id){
        testUserRepository.deleteById(id);
        return "删除成功";
    }


通过save更改

id要吻合

    @PostMapping("update")
    public Muser update(@RequestBody Muser muser){
        testUserRepository.save(muser);
        return muser;
    }

自己写sql语句

// 在删除/更改语句中要用@Modifying
@Modifying
// 用sql语句就要开启nativeQuery 
@Query(nativeQuery = true,value = "xxxxxxxxx")
public void updateById(int id);

联表查询

把上边实体类的userid更换

//
//    @Column(name = "user_id")
//    private int userId;
    @ManyToOne
    @JoinColumn(name = "user_id")
    private Muser muser;

之后就可以测试查询,就能成功

自动生成(增加,修改)日期

修改上边实体

 //   @Column(name = "created")
 //   private Date created;
 //   @Column(name = "last_login")
 //   private Date lastLogin;
    @Column(name = "created")
    @CreatedDate
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date created;
    @Column(name = "last_login")
    @LastModifiedDate
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date lastLogin;

在实体类上加注解@EntityListeners(AuditingEntityListener.class)

在启动类上加注解@EnableJpaAuditing


阿里规范每个表都要有创建时间和更新时间,所以我们可以把时间提取出来一个抽象类,让实体去继承

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AbDao {
    @Column(name = "created") //自定义通用就好
    @CreatedDate
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date created;
    @Column(name = "last_login")//自定义通用就好
    @LastModifiedDate
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date lastLogin;
}

整合querydsl

依赖

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <scope>provided</scope>
        </dependency>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            //输出目录
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

生成Q类

直接clean+compile

或者

Repository继承qsl

public interface TestUserRepository extends JpaRepository<Muser,Integer>, PagingAndSortingRepository<Muser,Integer>, JpaSpecificationExecutor<Muser>,QuerydslPredicateExecutor<Muser>{

}

实例

    public Predicate getContion(){
        QMuser muser = QMuser.muser;
        BooleanExpression between = muser.id.between(0, 5);
        BooleanExpression sd = muser.username.contains("sd").and(between);
        return sd;
    }

    @GetMapping("getList")
    public List<Muser> a(){
        List<Muser> all = (List<Muser>) testUserRepository.findAll(getContion());
        return all;
    }

如有疑问可私信



版权声明:本文为wai_58934原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。