java中Spring data jpa通过Predicate查询时间段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中Spring data jpa通过Predicate查询时间段相关的知识,希望对你有一定的参考价值。

如下,想搜索time1和time2之间的数据,但是查不到
cb是重写了方法中的参数CriteriaBuilder,root是参数Root
predicates.add(cb.between(root.<Date>get("createTime"),time1,time2));

方法代码:
public Page<UserPointsOrder> pageList(final GridReq req)
Page<UserPointsOrder> page = userPointsOrderDao.findAll(new Specification<UserPointsOrder>()
@Override
public Predicate toPredicate(Root<UserPointsOrder> root, CriteriaQuery<?> query, CriteriaBuilder cb)
List<Predicate> predicates = new ArrayList<>();
query.orderBy(cb.desc(root.<Long> get("guid")));
long userId = StringUtils.isEmpty(req.getKeys()) ? 0 : NumberUtils.toLong(req.getKeys().trim());
if (userId > 0)
predicates.add(cb.equal(root.<Long> get("userId"), userId));
if ((req.getOther() != null && req.getOther().has("startTime"))&&
(req.getOther() != null && req.getOther().has("endTime")))
String startTime = req.getOther().get("startTime").toString();
Date time1 = TimeUtil.parseDate(startTime,"yyyy-MM-dd HH:mm:ss");
String endTime = req.getOther().get("endTime").toString();
Date time2 = TimeUtil.parseDate(endTime,"yyyy-MM-dd HH:mm:ss");
predicates.add(cb.between(root.<Date>get("createTime"),time1,time2));

return cb.and(predicates.toArray(new Predicate[predicates.size()]));

, new PageRequest(req.getPage() - 1, req.getRows()));
return page;

参考技术A

public interface JpaSpecificationExecutor<T>
T findOne(Specification<T> var1);

List<T> findAll(Specification<T> var1);

Page<T> findAll(Specification<T> var1, Pageable var2);

List<T> findAll(Specification<T> var1, Sort var2);

long count(Specification<T> var1);

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

参考技术B 你这个findone(id)是用自己的@Query注解的jpql语句?如果不是,方法应该是findOne(Intergerid)才对,可但是你这个实体类哪里有id的字段;你也可以试试findBy字段这种方式另外注意下几个Repository接口的细微区别,会不会问题出在接口选择上面!

微服务 第六章 springboot 通过Spring-data-jpa 配置Oracle数据源(Spring-data-jpa详细介绍)

  JPA:Java Persistence API 是java持久化规范。它为java开发人员提供了一种对象/映射工具来管理java应用中的关系数据。目的是为了简化持久化开发工作和整合ORM技术。

  Spring Data JPA 是Spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架。可使得开发者用极简的代码即可实现对数据的访问和操作。

  Spring Data JPA默认生成了一些基本的增删改查。

    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAll(Iterable<ID> var1);

    <S extends T> List<S> save(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);

  

自定义操作:

具体的关键字,使用方法和生产成SQL如下表所示

KeywordSampleJPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ? ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

自定义SQL查询

  其实Spring data 觉大部分的SQL都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的SQL来查询,spring data也是完美支持的;在SQL的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional 对事物的支持,查询超时的设置等

@Modifying
@Query("update User u set u.userName = ?1 where u.id = ?2")
int modifyByIdAndUserId(String  userName, Long id);
	
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
  
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
    User findByEmailAddress(String emailAddress);

  

以上是关于java中Spring data jpa通过Predicate查询时间段的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot之 JPA/Hibernate/Spring Data

Spring Boot数据库交互之Spring Data JPA

Spring Data JPA

如何通过 Spring Data JPA 了解底层数据库名称

spring data jpa学习笔记一:helloworld

如何通过分页在 Spring Data JPA 中的 SELECT 子句中按别名对投影进行排序?