Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import java.util.Optional;
import java.util.function.Function;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface QuerydslJdbcFragment<T> {

/**
Expand All @@ -24,6 +27,8 @@ public interface QuerydslJdbcFragment<T> {

List<T> queryMany(Function<SQLQuery<?>, SQLQuery<T>> query);

Page<T> queryMany(Function<SQLQuery<T>, SQLQuery<T>> query, Pageable pageable);

/**
* @return amount of affected rows
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,15 @@ List<T> queryMany(SQLQuery<T> query) {
return result;
}

Page<T> queryMany(SQLQuery<T> query, Pageable pageable) {
Assert.notNull(query, "Query must not be null!");
Assert.notNull(pageable, "Pageable must not be null!");

var content = queryMany(querydsl.applyPagination(pageable, query));

return PageableExecutionUtils.getPage(content, pageable, query::fetchCount);
}

@Nullable
private List<T> query(SQLQuery<T> query,
RowMapperResultSetExtractor<T> rowMapperResultSetExtractor) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,22 @@
*/
package com.infobip.spring.data.jdbc;

import com.querydsl.core.types.*;
import com.querydsl.sql.*;
import com.querydsl.sql.dml.SQLUpdateClause;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;

import com.querydsl.core.types.ConstructorExpression;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Predicate;
import com.querydsl.sql.RelationalPath;
import com.querydsl.sql.SQLQuery;
import com.querydsl.sql.SQLQueryFactory;
import com.querydsl.sql.dml.SQLUpdateClause;

@Transactional(readOnly = true)
public class SimpleQuerydslJdbcFragment<T> implements QuerydslJdbcFragment<T> {

Expand Down Expand Up @@ -58,6 +65,12 @@ public List<T> queryMany(Function<SQLQuery<?>, SQLQuery<T>> query) {
return querydslJdbcPredicateExecutor.queryMany(query.apply(sqlQueryFactory.query()));
}

@Override
public Page<T> queryMany(Function<SQLQuery<T>, SQLQuery<T>> query, Pageable pageable) {
var newQuery = sqlQueryFactory.query().select(entityProjection());
return querydslJdbcPredicateExecutor.queryMany(query.apply(newQuery), pageable);
}

@Override
@Transactional
public long update(Function<SQLUpdateClause, Long> update) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,27 @@
package com.infobip.spring.data.jdbc;

import static com.infobip.spring.data.jdbc.QPerson.person;
import static com.infobip.spring.data.jdbc.QPersonSettings.personSettings;
import static org.assertj.core.api.BDDAssertions.then;
import static com.infobip.spring.data.jdbc.QPerson.*;
import static com.infobip.spring.data.jdbc.QPersonSettings.*;
import static org.assertj.core.api.BDDAssertions.*;

import java.time.ZoneOffset;
import java.util.List;
import java.util.TimeZone;
import java.util.stream.Collectors;

import com.infobip.spring.data.jdbc.extension.CustomQuerydslJdbcRepository;
import com.querydsl.core.types.Projections;
import com.querydsl.sql.SQLQueryFactory;
import lombok.AllArgsConstructor;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.transaction.annotation.Transactional;

import com.infobip.spring.data.jdbc.extension.CustomQuerydslJdbcRepository;
import com.querydsl.core.types.Projections;
import com.querydsl.sql.SQLQueryFactory;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class QuerydslJdbcRepositoryTest extends TestBase {

Expand Down Expand Up @@ -53,7 +57,8 @@ void shouldStreamAll() {
actual = stream.collect(Collectors.toList());
}

then(actual).usingRecursiveFieldByFieldElementComparator().containsExactlyInAnyOrder(johnDoe, johnyRoe, janeDoe);
then(actual).usingRecursiveFieldByFieldElementComparator()
.containsExactlyInAnyOrder(johnDoe, johnyRoe, janeDoe);
}

@Test
Expand Down Expand Up @@ -151,6 +156,27 @@ void shouldQueryMany() {
then(actual).containsOnly(johnDoe);
}

@Test
void shouldQueryManyWithPageable() {
// given
givenSavedPerson("John", "Doe");
givenSavedPerson("Johny", "Roe");
var janeDoe = givenSavedPerson("Jane", "Doe");
givenSavedPerson("John", "Roe");
givenSavedPerson("Janie", "Doe");
var janeStone = givenSavedPerson("Jane", "Stone");

var page = PageRequest.of(0, 2, Sort.by(Sort.Order.asc("firstName")));

var actual = repository.queryMany(sqlQuery -> sqlQuery.from(person)
.where(person.firstName.in("John", "Jane")), page);

then(actual.getSize()).isEqualTo(2);
then(actual.getTotalElements()).isEqualTo(4);
then(actual.getTotalPages()).isEqualTo(2);
then(actual).containsExactlyInAnyOrder(janeDoe, janeStone);
}

@Test
void shouldProject() {

Expand Down Expand Up @@ -184,8 +210,8 @@ void shouldUpdate() {

then(actual).isEqualTo(1);
then(repository.findAll()).extracting(Person::firstName)
.containsExactlyInAnyOrder("John", "John", "Jane")
.hasSize(3);
.containsExactlyInAnyOrder("John", "John", "Jane")
.hasSize(3);
}

@Test
Expand Down Expand Up @@ -259,7 +285,7 @@ void shouldSupportMultipleConstructors() {
void shouldExtendSimpleQuerydslJdbcRepository() {
// then
then(repository).isInstanceOf(QuerydslJdbcRepository.class)
.isNotInstanceOf(CustomQuerydslJdbcRepository.class);
.isNotInstanceOf(CustomQuerydslJdbcRepository.class);
}

@Transactional
Expand All @@ -270,9 +296,9 @@ void springDataAndQuerydslShouldHandleTimeZoneTheSameForSameTimeZone() {

// when
sqlQueryFactory.insert(person)
.columns(person.firstName, person.lastName, person.createdAt)
.values(givenPerson.firstName(), givenPerson.lastName(), givenPerson.createdAt())
.execute();
.columns(person.firstName, person.lastName, person.createdAt)
.values(givenPerson.firstName(), givenPerson.lastName(), givenPerson.createdAt())
.execute();
repository.save(givenPerson);

// then
Expand Down