Skip to content

Commit ea45660

Browse files
committed
add SortRepository & DynamicRepository
1 parent 25d681b commit ea45660

File tree

10 files changed

+184
-3
lines changed

10 files changed

+184
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import jakarta.persistence.EntityManager;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
8+
@Configuration
9+
public class DynamicConfiguration {
10+
11+
@Bean
12+
public DynamicQuery dynamicQuery(EntityManager entityManager){
13+
return new DynamicQuery(entityManager);
14+
}
15+
16+
@Bean
17+
public DynamicQueryContextRegister dynamicQueryContextRegister(DynamicQuery dynamicQuery){
18+
return new DynamicQueryContextRegister(dynamicQuery);
19+
}
20+
21+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import jakarta.persistence.EntityManager;
4+
import jakarta.persistence.TypedQuery;
5+
import lombok.AllArgsConstructor;
6+
import org.springframework.data.domain.Page;
7+
import org.springframework.data.domain.PageImpl;
8+
import org.springframework.data.domain.PageRequest;
9+
10+
import java.util.List;
11+
12+
@AllArgsConstructor
13+
public class DynamicQuery {
14+
15+
private final EntityManager entityManager;
16+
17+
public List<?> listQuery(Class<?> clazz, String sql, Object... params) {
18+
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
19+
if (params != null) {
20+
for (int i = 0; i < params.length; i++) {
21+
query.setParameter(i + 1, params[i]);
22+
}
23+
}
24+
return query.getResultList();
25+
}
26+
27+
public Page<?> pageQuery(Class<?> clazz, String sql, String countSql, PageRequest pageRequest, Object... params) {
28+
TypedQuery<?> query = entityManager.createQuery(sql, clazz);
29+
if (params != null) {
30+
for (int i = 0; i < params.length; i++) {
31+
query.setParameter(i + 1, params[i]);
32+
}
33+
}
34+
query.setFirstResult(pageRequest.getPageNumber() * pageRequest.getPageSize());
35+
query.setMaxResults(pageRequest.getPageSize());
36+
return new PageImpl<>(query.getResultList(), pageRequest, countQuery(countSql, params));
37+
}
38+
39+
40+
private long countQuery(String sql, Object... params) {
41+
TypedQuery<Long> query = entityManager.createQuery(sql, Long.class);
42+
if (params != null) {
43+
for (int i = 0; i < params.length; i++) {
44+
query.setParameter(i + 1, params[i]);
45+
}
46+
}
47+
return query.getSingleResult();
48+
}
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
4+
import lombok.Getter;
5+
6+
public class DynamicQueryContext {
7+
8+
@Getter
9+
private static final DynamicQueryContext instance = new DynamicQueryContext();
10+
11+
private DynamicQueryContext() {
12+
13+
}
14+
15+
@Getter
16+
private DynamicQuery dynamicQuery;
17+
18+
void setDynamicQuery(DynamicQuery dynamicQuery) {
19+
this.dynamicQuery = dynamicQuery;
20+
}
21+
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import lombok.AllArgsConstructor;
4+
import org.springframework.beans.factory.InitializingBean;
5+
6+
@AllArgsConstructor
7+
public class DynamicQueryContextRegister implements InitializingBean {
8+
9+
private DynamicQuery dynamicQuery;
10+
11+
@Override
12+
public void afterPropertiesSet() throws Exception {
13+
DynamicQueryContext.getInstance().setDynamicQuery(dynamicQuery);
14+
}
15+
16+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.codingapi.springboot.fast.dynamic;
2+
3+
import org.springframework.core.ResolvableType;
4+
import org.springframework.data.domain.Page;
5+
import org.springframework.data.domain.PageRequest;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.repository.NoRepositoryBean;
8+
9+
import java.util.List;
10+
11+
@NoRepositoryBean
12+
public interface DynamicRepository<T, ID> extends JpaRepository<T, ID> {
13+
14+
default Class<?> getEntityClass() {
15+
ResolvableType resolvableType = ResolvableType.forClass(this.getClass()).as(DynamicRepository.class);
16+
return resolvableType.getGeneric(new int[]{0}).resolve();
17+
}
18+
19+
default List<T> dynamicListQuery(String sql, Object... params) {
20+
return (List<T>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(getEntityClass(), sql, params);
21+
}
22+
23+
default <V> List<V> dynamicListQuery(Class<V> clazz, String sql, Object... params) {
24+
return (List<V>) DynamicQueryContext.getInstance().getDynamicQuery().listQuery(clazz, sql, params);
25+
}
26+
27+
default Page<T> dynamicPageQuery(String sql, String countSql, PageRequest request, Object... params) {
28+
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, countSql, request, params);
29+
}
30+
31+
default Page<T> dynamicPageQuery(String sql, PageRequest request, Object... params) {
32+
return (Page<T>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(getEntityClass(), sql, "select count(1) " + sql, request, params);
33+
}
34+
35+
default <V> Page<V> dynamicPageQuery(Class<V> clazz, String sql, String countSql, PageRequest request, Object... params) {
36+
return (Page<V>) DynamicQueryContext.getInstance().getDynamicQuery().pageQuery(clazz, sql, countSql, request, params);
37+
}
38+
39+
}

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.springboot.fast.query;
22

3+
import com.codingapi.springboot.fast.dynamic.DynamicRepository;
34
import com.codingapi.springboot.framework.dto.request.PageRequest;
45
import jakarta.persistence.criteria.Order;
56
import jakarta.persistence.criteria.Predicate;
@@ -13,7 +14,7 @@
1314
import java.util.List;
1415

1516
@NoRepositoryBean
16-
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
17+
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {
1718

1819
default Page<T> findAll(PageRequest request) {
1920
if (request.hasFilter()) {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.codingapi.springboot.fast.sort;
2+
3+
public interface ISort {
4+
5+
Integer getSort();
6+
7+
void setSort(Integer sort);
8+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.codingapi.springboot.fast.sort;
2+
3+
import org.springframework.data.domain.PageRequest;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.repository.NoRepositoryBean;
6+
7+
import java.util.List;
8+
9+
@NoRepositoryBean
10+
public interface SortRepository<T extends ISort, I> extends JpaRepository<T, I> {
11+
12+
13+
default void sort(PageRequest request, List<Integer> ids) {
14+
for (int i = 0; i < ids.size(); i++) {
15+
ISort entity = getById((I) ids.get(i));
16+
entity.setSort(i + ((request.getPageNumber() - 1) * request.getPageSize()));
17+
save((T) entity);
18+
}
19+
}
20+
21+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
22
com.codingapi.springboot.fast.DataFastConfiguration,\
3-
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
3+
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar,\
4+
com.codingapi.springboot.fast.dynamic.DynamicConfiguration
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
com.codingapi.springboot.fast.DataFastConfiguration
2-
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
2+
com.codingapi.springboot.fast.registrar.DataFastBeanDefinitionRegistrar
3+
com.codingapi.springboot.fast.dynamic.DynamicConfiguration

0 commit comments

Comments
 (0)