QueryDSL/MySQL
QueryDSL에서 orderby로 랜덤한 레코드를 가져올 땐 NumberExpression.random()을 사용한다.
근데 MySQL에서는 QueryDSL의 NumberExpression.random() 기능을 사용할 수 없다.
이건 엄밀히 따지면 트러블은 아니다. 그냥 MySQL이 해당 기능을 지원하지 않을 뿐이다.
지원 가능하도록 JPQLTemplates를 튜닝해주면 된다.
참고로 이 기능은 인덱싱이 통하지 않기 때문에 매우 무겁게 작동한다.
레코드가 많다면 인덱싱을 위한 편법을 사용해줘야 할 수도 있다.
public class MySqlJpaTemplates extends JPQLTemplates{
public static finalMySqlJpaTemplatesDEFAULT = new MySqlJpaTemplates();
public MySqlJpaTemplates() {
this(DEFAULT_ESCAPE);
add(Ops.MathOps.RANDOM, "rand()");
add(Ops.MathOps.RANDOM2, "rand({0})");
}
public MySqlJpaTemplates(charescape) {
super(escape);
}
}
적용예
private List<Quiz> randomQuizPick(int count) {
// count 만큼의 레코드를 랜덤하게 받아오는 구문
// MySqlJpaTemplates.DEFAULT : NumberExpression.random().asc()를 MySQL에서 사용 가능하도록
// 튜닝한 템플릿.
JPAQuery<Quiz> query = new JPAQuery<>(entityManager, MySqlJpaTemplates.DEFAULT);
QQuiz qQuiz = new QQuiz("quiz");
List<Quiz> quizList = query.from(qQuiz)
.orderBy(NumberExpression.random().asc())
.limit(count)
.fetch();
return quizList;
}
'내가 배운 것들 > 문제 해결' 카테고리의 다른 글
[SpringBoot] DTO 형식으로 반환해줄 때, NULL값은 숨긴 채로 되돌려주기 (0) | 2021.12.23 |
---|---|
[RegExp] 아이디, 닉네임, 비밀번호 정규식 (1) | 2021.12.23 |
[QueryDSL] Handler dispatch failed; nested exception is java.lang.NoSuchFieldError: TREATED_PATH (0) | 2021.12.22 |
[SpringBoot] Swagger v2를 Jwt 인증 환경에서 사용할 수 있도록 구성하기 (0) | 2021.12.11 |
[SpringBoot] JPA를 이용해 랜덤한 하나의 레코드만 가져오려면 어떻게 해야할까? (0) | 2021.12.09 |
댓글