Replace NoCountPagingRepository by interface with dedicated findAllWithoutCount (#1146)

* Replace NoCountPagingRepository by enhanced BaseRepository

Signed-off-by: Alexander Dobler <alexander.dobler3@bosch.io>

* Add missed withoutcount call in distributionsettype find all

Signed-off-by: Alexander Dobler <alexander.dobler3@bosch.io>

* Add missing overrides to NoCountRepository implementation

Signed-off-by: Alexander Dobler <alexander.dobler3@bosch.io>

* Remove need of repository by referencing base class directly in configuration

Signed-off-by: Alexander Dobler <alexander.dobler3@bosch.io>
This commit is contained in:
Alexander Dobler
2021-08-04 17:46:31 +02:00
committed by GitHub
parent df84047e5d
commit 8c0bd2ffd2
11 changed files with 148 additions and 185 deletions

View File

@@ -29,7 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
@NoRepositoryBean
@Transactional(readOnly = true)
public interface BaseEntityRepository<T extends AbstractJpaTenantAwareBaseEntity, I extends Serializable>
extends PagingAndSortingRepository<T, I> {
extends PagingAndSortingRepository<T, I>, NoCountSliceRepository<T> {
/**
* Retrieves an {@link BaseEntity} by its id.

View File

@@ -100,8 +100,6 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
private final ActionRepository actionRepository;
private final NoCountPagingRepository criteriaNoCountDao;
private final EventPublisherHolder eventPublisherHolder;
private final TenantAware tenantAware;
@@ -122,8 +120,8 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement,
final DistributionSetMetadataRepository distributionSetMetadataRepository,
final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository,
final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder,
final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer,
final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware,
final VirtualPropertyReplacer virtualPropertyReplacer,
final SoftwareModuleRepository softwareModuleRepository,
final DistributionSetTagRepository distributionSetTagRepository,
final AfterTransactionCommitExecutor afterCommit, final Database database) {
@@ -136,7 +134,6 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
this.distributionSetMetadataRepository = distributionSetMetadataRepository;
this.targetFilterQueryRepository = targetFilterQueryRepository;
this.actionRepository = actionRepository;
this.criteriaNoCountDao = criteriaNoCountDao;
this.eventPublisherHolder = eventPublisherHolder;
this.tenantAware = tenantAware;
this.virtualPropertyReplacer = virtualPropertyReplacer;
@@ -793,8 +790,9 @@ public class JpaDistributionSetManagement implements DistributionSetManagement {
@Override
public Slice<DistributionSet> findAll(final Pageable pageable) {
return convertDsPage(criteriaNoCountDao.findAll(DistributionSetSpecification.isDeleted(false), pageable,
JpaDistributionSet.class), pageable);
return convertDsPage(
distributionSetRepository.findAllWithoutCount(DistributionSetSpecification.isDeleted(false), pageable),
pageable);
}
@Override

View File

@@ -55,18 +55,14 @@ public class JpaDistributionSetTagManagement implements DistributionSetTagManage
private final VirtualPropertyReplacer virtualPropertyReplacer;
private final NoCountPagingRepository criteriaNoCountDao;
private final Database database;
JpaDistributionSetTagManagement(final DistributionSetTagRepository distributionSetTagRepository,
final DistributionSetRepository distributionSetRepository,
final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao,
final Database database) {
final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) {
this.distributionSetTagRepository = distributionSetTagRepository;
this.distributionSetRepository = distributionSetRepository;
this.virtualPropertyReplacer = virtualPropertyReplacer;
this.criteriaNoCountDao = criteriaNoCountDao;
this.database = database;
}
@@ -129,7 +125,7 @@ public class JpaDistributionSetTagManagement implements DistributionSetTagManage
@Override
public Slice<DistributionSetTag> findAll(final Pageable pageable) {
return convertDsPage(criteriaNoCountDao.findAll(pageable, JpaDistributionSetTag.class), pageable);
return convertDsPage(distributionSetTagRepository.findAllWithoutCount(pageable), pageable);
}
@Override

View File

@@ -68,7 +68,6 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana
private final VirtualPropertyReplacer virtualPropertyReplacer;
private final NoCountPagingRepository criteriaNoCountDao;
private final Database database;
private final QuotaManagement quotaManagement;
@@ -76,13 +75,12 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana
JpaDistributionSetTypeManagement(final DistributionSetTypeRepository distributionSetTypeRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final DistributionSetRepository distributionSetRepository,
final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao,
final Database database, final QuotaManagement quotaManagement) {
final VirtualPropertyReplacer virtualPropertyReplacer, final Database database,
final QuotaManagement quotaManagement) {
this.distributionSetTypeRepository = distributionSetTypeRepository;
this.softwareModuleTypeRepository = softwareModuleTypeRepository;
this.distributionSetRepository = distributionSetRepository;
this.virtualPropertyReplacer = virtualPropertyReplacer;
this.criteriaNoCountDao = criteriaNoCountDao;
this.database = database;
this.quotaManagement = quotaManagement;
}
@@ -234,8 +232,8 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana
@Override
public Slice<DistributionSetType> findAll(final Pageable pageable) {
return convertPage(criteriaNoCountDao.findAll(DistributionSetTypeSpecification.isDeleted(false), pageable,
JpaDistributionSetType.class), pageable);
return convertPage(distributionSetTypeRepository
.findAllWithoutCount(DistributionSetTypeSpecification.isDeleted(false), pageable), pageable);
}
@Override

View File

@@ -103,8 +103,6 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement {
private final SoftwareModuleTypeRepository softwareModuleTypeRepository;
private final NoCountPagingRepository criteriaNoCountDao;
private final AuditorAware<String> auditorProvider;
private final ArtifactManagement artifactManagement;
@@ -119,8 +117,7 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement {
final DistributionSetRepository distributionSetRepository,
final SoftwareModuleRepository softwareModuleRepository,
final SoftwareModuleMetadataRepository softwareModuleMetadataRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final NoCountPagingRepository criteriaNoCountDao, final AuditorAware<String> auditorProvider,
final SoftwareModuleTypeRepository softwareModuleTypeRepository, final AuditorAware<String> auditorProvider,
final ArtifactManagement artifactManagement, final QuotaManagement quotaManagement,
final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) {
this.entityManager = entityManager;
@@ -128,7 +125,6 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement {
this.softwareModuleRepository = softwareModuleRepository;
this.softwareModuleMetadataRepository = softwareModuleMetadataRepository;
this.softwareModuleTypeRepository = softwareModuleTypeRepository;
this.criteriaNoCountDao = criteriaNoCountDao;
this.auditorProvider = auditorProvider;
this.artifactManagement = artifactManagement;
this.quotaManagement = quotaManagement;
@@ -222,8 +218,7 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement {
private Slice<JpaSoftwareModule> findByCriteriaAPI(final Pageable pageable,
final List<Specification<JpaSoftwareModule>> specList) {
return criteriaNoCountDao.findAll(SpecificationsBuilder.combineWithAnd(specList), pageable,
JpaSoftwareModule.class);
return softwareModuleRepository.findAllWithoutCount(SpecificationsBuilder.combineWithAnd(specList), pageable);
}
private Long countSwModuleByCriteriaAPI(final List<Specification<JpaSoftwareModule>> specList) {

View File

@@ -55,19 +55,17 @@ public class JpaSoftwareModuleTypeManagement implements SoftwareModuleTypeManage
private final SoftwareModuleRepository softwareModuleRepository;
private final NoCountPagingRepository criteriaNoCountDao;
private final Database database;
public JpaSoftwareModuleTypeManagement(final DistributionSetTypeRepository distributionSetTypeRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final VirtualPropertyReplacer virtualPropertyReplacer,
final SoftwareModuleRepository softwareModuleRepository, final NoCountPagingRepository criteriaNoCountDao,
final SoftwareModuleRepository softwareModuleRepository,
final Database database) {
this.distributionSetTypeRepository = distributionSetTypeRepository;
this.softwareModuleTypeRepository = softwareModuleTypeRepository;
this.virtualPropertyReplacer = virtualPropertyReplacer;
this.softwareModuleRepository = softwareModuleRepository;
this.criteriaNoCountDao = criteriaNoCountDao;
this.database = database;
}
@@ -98,9 +96,9 @@ public class JpaSoftwareModuleTypeManagement implements SoftwareModuleTypeManage
@Override
public Slice<SoftwareModuleType> findAll(final Pageable pageable) {
return convertPage(criteriaNoCountDao.findAll(
return convertPage(softwareModuleTypeRepository.findAllWithoutCount(
(targetRoot, query, cb) -> cb.equal(targetRoot.<Boolean> get(JpaSoftwareModuleType_.deleted), false),
pageable, JpaSoftwareModuleType.class), pageable);
pageable), pageable);
}
@Override

View File

@@ -108,8 +108,6 @@ public class JpaTargetManagement implements TargetManagement {
private final TargetTagRepository targetTagRepository;
private final NoCountPagingRepository criteriaNoCountDao;
private final EventPublisherHolder eventPublisherHolder;
private final TenantAware tenantAware;
@@ -125,7 +123,7 @@ public class JpaTargetManagement implements TargetManagement {
final RolloutGroupRepository rolloutGroupRepository,
final DistributionSetRepository distributionSetRepository,
final TargetFilterQueryRepository targetFilterQueryRepository,
final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao,
final TargetTagRepository targetTagRepository,
final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware,
final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer,
final Database database) {
@@ -137,7 +135,6 @@ public class JpaTargetManagement implements TargetManagement {
this.distributionSetRepository = distributionSetRepository;
this.targetFilterQueryRepository = targetFilterQueryRepository;
this.targetTagRepository = targetTagRepository;
this.criteriaNoCountDao = criteriaNoCountDao;
this.eventPublisherHolder = eventPublisherHolder;
this.tenantAware = tenantAware;
this.afterCommit = afterCommit;
@@ -300,7 +297,7 @@ public class JpaTargetManagement implements TargetManagement {
@Override
public Slice<Target> findAll(final Pageable pageable) {
return convertPage(criteriaNoCountDao.findAll(pageable, JpaTarget.class), pageable);
return convertPage(targetRepository.findAllWithoutCount(pageable), pageable);
}
@Override
@@ -488,10 +485,10 @@ public class JpaTargetManagement implements TargetManagement {
private Slice<Target> findByCriteriaAPI(final Pageable pageable, final List<Specification<JpaTarget>> specList) {
if (CollectionUtils.isEmpty(specList)) {
return convertPage(criteriaNoCountDao.findAll(pageable, JpaTarget.class), pageable);
return convertPage(targetRepository.findAllWithoutCount(pageable), pageable);
}
return convertPage(
criteriaNoCountDao.findAll(SpecificationsBuilder.combineWithAnd(specList), pageable, JpaTarget.class),
targetRepository.findAllWithoutCount(SpecificationsBuilder.combineWithAnd(specList), pageable),
pageable);
}

View File

@@ -1,116 +0,0 @@
/**
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.repository.jpa;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Repository;
/**
* Workaround as spring data does not provide a {@link Slice} based
* {@link JpaRepository#findAll()}.
*
*/
@Repository
public class NoCountPagingRepository {
@Autowired
protected EntityManager em;
/**
* Searches without the need for an extra count query.
*
* @param spec
* to search for
* @param pageable
* information
* @param domainClass
* of the {@link Entity}
*
* @return {@link Slice} of data
*
* @see org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll(org.springframework
* .data.jpa.domain.Specification,
* org.springframework.data.domain.Pageable)
*/
public <T, I extends Serializable> Slice<T> findAll(final Specification<T> spec, final Pageable pageable,
final Class<T> domainClass) {
final SimpleJpaNoCountRepository<T, I> noCountDao = new SimpleJpaNoCountRepository<>(domainClass, em);
return noCountDao.findAll(spec, pageable);
}
/**
* Searches without the need for an extra count query.
*
* @param pageable
* information
* @param domainClass
* of the {@link Entity}
*
* @return {@link Slice} of data
*
* @see org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll(org.springframework
* .data.jpa.domain.Specification,
* org.springframework.data.domain.Pageable)
*/
public <T, I extends Serializable> Slice<T> findAll(final Pageable pageable, final Class<T> domainClass) {
final SimpleJpaNoCountRepository<T, I> noCountDao = new SimpleJpaNoCountRepository<>(domainClass, em);
return noCountDao.findAll(pageable);
}
/**
* Repository implementation with disabled count query.
*
*
*
* @param <T>
* entity type
* @param <I>
* key or ID type
*/
public static class SimpleJpaNoCountRepository<T, I extends Serializable> extends SimpleJpaRepository<T, I> {
/**
* Constructor.
*
* @param domainClass
* of the {@link Entity}
* @param em
* {@link EntityManager} instance for the queries
*/
public SimpleJpaNoCountRepository(final Class<T> domainClass, final EntityManager em) {
super(domainClass, em);
}
@Override
protected <S extends T> Page<S> readPage(final TypedQuery<S> query, final Class<S> domainClass,
final Pageable pageable, @Nullable final Specification<S> spec) {
query.setFirstResult((int) pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
final List<S> content = query.getResultList();
return new PageImpl<>(content, pageable, content.size());
}
}
}

View File

@@ -0,0 +1,45 @@
/**
* Copyright (c) 2021 Bosch.IO GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.repository.jpa;
import org.eclipse.hawkbit.repository.model.BaseEntity;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.lang.Nullable;
/**
* Repository interface that offers findAll with disabled count query.
*
* @param <T>
* entity type
*/
public interface NoCountSliceRepository<T> {
/**
* Retrieves a slice of {@link BaseEntity}s without keeping the count updated
*
* @param pageable
* page to keep track of slices
* @return {@link BaseEntity}
*/
Slice<T> findAllWithoutCount(Pageable pageable);
/**
* Retrieves a slice of {@link BaseEntity}s based on spec without keeping the
* count updated
*
* @param spec
* to search for
* @param pageable
* page to keep track of slices
* @return {@link BaseEntity}
*/
Slice<T> findAllWithoutCount(@Nullable Specification<T> spec, Pageable pageable);
}

View File

@@ -134,7 +134,7 @@ import com.google.common.collect.Maps;
* General configuration for hawkBit's Repository.
*
*/
@EnableJpaRepositories("org.eclipse.hawkbit.repository.jpa")
@EnableJpaRepositories(value = "org.eclipse.hawkbit.repository.jpa", repositoryBaseClass = SimpleJpaWithNoCountRepository.class)
@EnableTransactionManagement
@EnableJpaAuditing
@EnableAspectJAutoProxy
@@ -194,12 +194,6 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
return new AfterTransactionCommitDefaultServiceExecutor();
}
@Bean
@ConditionalOnMissingBean
NoCountPagingRepository noCountPagingRepository() {
return new NoCountPagingRepository();
}
@Bean
@ConditionalOnMissingBean
RsqlValidationOracle rsqlValidationOracle() {
@@ -447,14 +441,14 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement,
final DistributionSetMetadataRepository distributionSetMetadataRepository,
final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository,
final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder,
final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer,
final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware,
final VirtualPropertyReplacer virtualPropertyReplacer,
final SoftwareModuleRepository softwareModuleRepository,
final DistributionSetTagRepository distributionSetTagRepository,
final AfterTransactionCommitExecutor afterCommit, final JpaProperties properties) {
return new JpaDistributionSetManagement(entityManager, distributionSetRepository, distributionSetTagManagement,
systemManagement, distributionSetTypeManagement, quotaManagement, distributionSetMetadataRepository,
targetFilterQueryRepository, actionRepository, criteriaNoCountDao, eventPublisherHolder, tenantAware,
targetFilterQueryRepository, actionRepository, eventPublisherHolder, tenantAware,
virtualPropertyReplacer, softwareModuleRepository, distributionSetTagRepository, afterCommit,
properties.getDatabase());
@@ -471,11 +465,10 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
final DistributionSetTypeRepository distributionSetTypeRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final DistributionSetRepository distributionSetRepository,
final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao,
final JpaProperties properties, final QuotaManagement quotaManagement) {
final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties,
final QuotaManagement quotaManagement) {
return new JpaDistributionSetTypeManagement(distributionSetTypeRepository, softwareModuleTypeRepository,
distributionSetRepository, virtualPropertyReplacer, criteriaNoCountDao, properties.getDatabase(),
quotaManagement);
distributionSetRepository, virtualPropertyReplacer, properties.getDatabase(), quotaManagement);
}
/**
@@ -512,14 +505,12 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
final RolloutGroupRepository rolloutGroupRepository,
final DistributionSetRepository distributionSetRepository,
final TargetFilterQueryRepository targetFilterQueryRepository,
final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao,
final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware,
final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer,
final JpaProperties properties) {
final TargetTagRepository targetTagRepository, final EventPublisherHolder eventPublisherHolder,
final TenantAware tenantAware, final AfterTransactionCommitExecutor afterCommit,
final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) {
return new JpaTargetManagement(entityManager, quotaManagement, targetRepository, targetMetadataRepository,
rolloutGroupRepository, distributionSetRepository, targetFilterQueryRepository, targetTagRepository,
criteriaNoCountDao, eventPublisherHolder, tenantAware, afterCommit, virtualPropertyReplacer,
properties.getDatabase());
eventPublisherHolder, tenantAware, afterCommit, virtualPropertyReplacer, properties.getDatabase());
}
/**
@@ -579,10 +570,9 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
DistributionSetTagManagement distributionSetTagManagement(
final DistributionSetTagRepository distributionSetTagRepository,
final DistributionSetRepository distributionSetRepository,
final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao,
final JpaProperties properties) {
final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) {
return new JpaDistributionSetTagManagement(distributionSetTagRepository, distributionSetRepository,
virtualPropertyReplacer, criteriaNoCountDao, properties.getDatabase());
virtualPropertyReplacer, properties.getDatabase());
}
/**
@@ -596,13 +586,12 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
final DistributionSetRepository distributionSetRepository,
final SoftwareModuleRepository softwareModuleRepository,
final SoftwareModuleMetadataRepository softwareModuleMetadataRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final NoCountPagingRepository criteriaNoCountDao, final AuditorAware<String> auditorProvider,
final SoftwareModuleTypeRepository softwareModuleTypeRepository, final AuditorAware<String> auditorProvider,
final ArtifactManagement artifactManagement, final QuotaManagement quotaManagement,
final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) {
return new JpaSoftwareModuleManagement(entityManager, distributionSetRepository, softwareModuleRepository,
softwareModuleMetadataRepository, softwareModuleTypeRepository, criteriaNoCountDao, auditorProvider,
artifactManagement, quotaManagement, virtualPropertyReplacer, properties.getDatabase());
softwareModuleMetadataRepository, softwareModuleTypeRepository, auditorProvider, artifactManagement,
quotaManagement, virtualPropertyReplacer, properties.getDatabase());
}
/**
@@ -616,10 +605,9 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration {
final DistributionSetTypeRepository distributionSetTypeRepository,
final SoftwareModuleTypeRepository softwareModuleTypeRepository,
final VirtualPropertyReplacer virtualPropertyReplacer,
final SoftwareModuleRepository softwareModuleRepository, final NoCountPagingRepository criteriaNoCountDao,
final JpaProperties properties) {
final SoftwareModuleRepository softwareModuleRepository, final JpaProperties properties) {
return new JpaSoftwareModuleTypeManagement(distributionSetTypeRepository, softwareModuleTypeRepository,
virtualPropertyReplacer, softwareModuleRepository, criteriaNoCountDao, properties.getDatabase());
virtualPropertyReplacer, softwareModuleRepository, properties.getDatabase());
}
@Bean

View File

@@ -0,0 +1,64 @@
/**
* Copyright (c) 2021 Bosch.IO GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.repository.jpa;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.lang.Nullable;
/**
* Repository implementation that allows findAll with disabled count query.
*
* @param <T>
* entity type
* @param <I>
* key or ID type
*/
public class SimpleJpaWithNoCountRepository<T, I extends Serializable> extends SimpleJpaRepository<T, I>
implements NoCountSliceRepository<T> {
public SimpleJpaWithNoCountRepository(final Class<T> domainClass, final EntityManager em) {
super(domainClass, em);
}
public SimpleJpaWithNoCountRepository(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
@Override
public Slice<T> findAllWithoutCount(@Nullable Specification<T> spec, Pageable pageable) {
TypedQuery<T> query = getQuery(spec, pageable);
return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) : readPageWithoutCount(query, pageable);
}
@Override
public Slice<T> findAllWithoutCount(final Pageable pageable) {
return findAllWithoutCount(null, pageable);
}
protected <S extends T> Page<S> readPageWithoutCount(final TypedQuery<S> query, final Pageable pageable) {
query.setFirstResult((int) pageable.getOffset());
query.setMaxResults(pageable.getPageSize());
final List<S> content = query.getResultList();
return new PageImpl<>(content, pageable, content.size());
}
}