jpa 动态sql拼接_spring boot 中JPA使用动态SQL查询

spring boot中的jpa非常好用,但是在创建动态查询时稍微有些麻烦。基本上有以下两种办法:

方法一:用criteria查询

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

CriteriaBuilder接口用来构建Predicate,而Predicate接口用来连接子句,每次添加到predicate之前都要进行参数非空判断。

//dao层需继承JpaSpecificationExecutor

public interface BeanRepository extends JpaRepository, JpaSpecificationExecutor {

}

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

//关键代码

@Override

public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {

List predicates = new ArrayList();

//参数非空判断

if (params.get("Key值") != null && StringUtils.isNotBlank((String) params.get("Key值"))) {

predicates.add(cb.equal(root.get("bean中的变量,eg.age").as(Integer.class), params.get("age对应的参数Map中的Key")));

}

return query.where(predicates.toArray(new Predicate[predicates.size()]));

}

方法二:直接使用原生SQL,构建query来执行

由于本人涉及到的前台传回来的sql长短和条件都不固定,并且参数较多,写起来很麻烦。因此选择这种办法,将前台的数据拼接为sql,直接创建查询。

导入的包:

import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import javax.persistence.EntityManager;

import javax.persistence.Query;

EntityManager直接创建原生查询,createNativeQuery的参数(string sql,info.class)写入Bean.class,就直接可以用List接收了

private LocalContainerEntityManagerFactoryBean entityManagerFactory;

public void exec(){

EntityManager em = entityManagerFactory.getNativeEntityManagerFactory().createEntityManager();

StringBuilder sqljoint=new StringBuilder(300);

sqljoint.append("SELECT * FROM public.entity where 1=1");

//sqljoint.apped("附加的where子句")

String sql=sqljoint.toString();

em.getTransaction().begin();

//创建原生查询的时候,将info.class类即第二个参数,写成要传回的bean,这样就可以直接用List接收

Query query = em.createNativeQuery(sql,EntityBean.class);

List obj=query.getResultList();

}

Ps:链接备忘

spring boot jpa 使用原生sql查询

https://blog.csdn.net/weixin_40256864/article/details/81092853

mapbox教程

https://blog.csdn.net/jwdstef/article/details/38760111

手写汉字识别

http://lib.csdn.net/article/aiframework/60528

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring JPASpring Data JPA的一个模块,它提供了一种更简单和优雅的方式来处理数据库操作。动态SQL是指在运行时根据不同的条件动态生成SQL语句,通常用于查询操作。Spring JPA提供了一种方便的方式来生成动态SQL,这种方式称为Specification。 Specification是一个接口,它定义了一个生成动态SQL语句的方法。这个方法需要返回一个Predicate对象,Predicate对象可以用来表示查询条件。Specification接口可以被实现,以便为每个查询定义一个特定的规范。Spring Data JPA还提供了一个SpecificationExecutor接口,它提供了使用Specification进行查询的方法。 使用Spring JPA动态SQL有以下几个步骤: 1. 创建一个Specification对象,实现Specification接口,并实现toPredicate方法。 2. 在Repository接口定义使用Specification查询的方法。 3. 在Service层调用Repository定义的方法,传入Specification对象和Pageable对象(如果需要分页)。 下面是一个示例Specification的实现: ```java public class UserSpecification implements Specification<User> { private SearchCriteria criteria; public UserSpecification(SearchCriteria criteria) { this.criteria = criteria; } @Override public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) { if (criteria.getOperation().equalsIgnoreCase(">")) { return builder.greaterThanOrEqualTo(root.<String> get(criteria.getKey()), criteria.getValue().toString()); } else if (criteria.getOperation().equalsIgnoreCase("<")) { return builder.lessThanOrEqualTo(root.<String> get(criteria.getKey()), criteria.getValue().toString()); } else if (criteria.getOperation().equalsIgnoreCase(":")) { if (root.get(criteria.getKey()).getJavaType() == String.class) { return builder.like(root.<String> get(criteria.getKey()), "%" + criteria.getValue() + "%"); } else { return builder.equal(root.get(criteria.getKey()), criteria.getValue()); } } return null; } } ``` 在上面的代码,我们实现了Specification接口的toPredicate方法,并根据SearchCriteria对象的属性值生成对应的Predicate对象。 下面是一个使用Specification进行查询的Repository方法: ```java @Repository public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> { } ``` 通过继承JpaSpecificationExecutor接口,我们可以使用Spring JPA提供的动态查询功能。 如果您有任何关于Spring JPA动态SQL方面的问题,欢迎随时问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值