EN
Spring JPA - create specification that returns entities in random order (MySql ORDER BY RAND() function)
9 points
In this article, we would like to show how in Spring JPA create Specification that provides random order for returned entities (random sorting).
Quick solution:
xxxxxxxxxx
1
// CriteriaQuery<?> query = ...
2
// CriteriaBuilder builder = ...
3
4
// put inside toPredicate function following line:
5
//
6
query.orderBy(builder.asc(builder.function("RAND", null))); // MySql RAND() function used
7
8
// do not use sort parameter using PageRequest:
9
//
10
PageRequest pageRequest = PageRequest.of(pageNumber - 1, pageSize);
OffersController.java
file:
xxxxxxxxxx
1
package com.example.controllers;
2
3
import org.springframework.data.domain.Page;
4
import org.springframework.data.domain.PageRequest;
5
import org.springframework.http.MediaType;
6
import org.springframework.stereotype.Controller;
7
import org.springframework.web.bind.annotation.RequestMapping;
8
import org.springframework.web.bind.annotation.RequestMethod;
9
import org.springframework.web.bind.annotation.ResponseBody;
10
11
import javax.servlet.http.HttpServletRequest;
12
13
import com.example.utils.HttpUtils;
14
import com.example.database.repositories.OffersRepository; // use your repository here
15
import com.example.database.specifications.OffersSpecification;
16
import com.example.database.entities.OfferEntity;
17
18
19
public class OffersController {
20
21
22
private OffersRepository offersRepository,
23
24
(
25
method = RequestMethod.GET,
26
value = "/offers",
27
produces = MediaType.APPLICATION_JSON_VALUE
28
)
29
30
public List<OfferEntity> getOffers(HttpServletRequest request) {
31
32
int pageNumber = 1;
33
int pageSize = 20;
34
35
OffersSpecification offersSpecification = new OffersSpecification();
36
PageRequest pageRequest = PageRequest.of(pageNumber - 1, pageSize); // do not add here sort parameter here
37
38
Page<OfferEntity> pagedOffers = this.offersRepository.findAll(offersSpecification, pageRequest);
39
40
return pagedOffers;
41
}
42
}
OffersSpecification.java
file:
xxxxxxxxxx
1
package com.example.database.specifications;
2
3
import org.springframework.data.jpa.domain.Specification;
4
5
import javax.persistence.criteria.CriteriaBuilder;
6
import javax.persistence.criteria.CriteriaQuery;
7
import javax.persistence.criteria.Predicate;
8
import javax.persistence.criteria.Root;
9
10
import com.example.database.entities.OfferEntity;
11
12
public class OffersSpecification implements Specification<OfferEntity> {
13
14
15
public Predicate toPredicate(Root<OfferEntity> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
16
Predicate predicate = builder.and();
17
18
// ...
19
20
query.orderBy(builder.asc(builder.function("RAND", null))); // MySql RAND() function used
21
22
return predicate;
23
}
24
}
OfferEntity.java
file:
xxxxxxxxxx
1
package com.example.database.entities;
2
3
import javax.persistence.GeneratedValue;
4
import javax.persistence.GenerationType;
5
import javax.persistence.Id;
6
import javax.persistence.Entity;
7
import javax.persistence.Table;
8
9
import java.util.Date;
10
11
12
name = "offers") (
13
public class OfferEntity
14
{
15
16
strategy = GenerationType.IDENTITY) (
17
private Long id;
18
19
// other fields ...
20
21
private Long parentId;
22
private Date publicationTime;
23
24
// getters and setters ...
25
}