Я хотел разделить несколько модулей. следуя кодам дна.
конечно, бизнес-коды в весенней партии.
1. querydsl entity module
ㄴ spring batch one // including business code
ㄴ spring batch two // including business code
ㄴ ~~
ㄴ ~~
ㄴ ~~
вот код партии
job..
step..
@Bean
public QuerydslPagingItemReader<School> reader() {
return new QuerydslPagingItemReader<>(entityManagerFactory, CHUNK_SIZE
, query -> query.selectFrom(school).where(school.id.eq(10L)));
}
processor..
writer..
и пользовательский запросdslItemReader
public class QuerydslPagingItemReader<T> extends AbstractPagingItemReader<T> {
protected final Map<String, Object> jpaPropertyMap = new HashMap<>();
protected EntityManagerFactory entityManagerFactory;
protected EntityManager entityManager;
protected Function<JPAQueryFactory, JPAQuery<T>> queryFunction;
protected boolean transacted = false;
protected QuerydslPagingItemReader() {
setName(ClassUtils.getShortName(QuerydslPagingItemReader.class));
}
public QuerydslPagingItemReader(EntityManagerFactory entityManagerFactory,
int pageSize,
Function<JPAQueryFactory, JPAQuery<T>> queryFunction) {
this(entityManagerFactory, pageSize, false, queryFunction);
}
public QuerydslPagingItemReader(EntityManagerFactory entityManagerFactory,
int pageSize,
boolean transacted,
Function<JPAQueryFactory, JPAQuery<T>> queryFunction) {
this();
this.entityManagerFactory = entityManagerFactory;
this.queryFunction = queryFunction;
setPageSize(pageSize);
setTransacted(transacted);
}
public void setTransacted(boolean transacted) {
this.transacted = transacted;
}
@Override
protected void doOpen() throws Exception {
super.doOpen();
entityManager = entityManagerFactory.createEntityManager(jpaPropertyMap);
if (entityManager == null) {
throw new DataAccessResourceFailureException("Unable to obtain an EntityManager");
}
}
@Override
@SuppressWarnings("unchecked")
protected void doReadPage() {
EntityTransaction tx = getTxOrNull();
JPAQuery<T> query = createQuery()
.offset(getPage() * getPageSize())
.limit(getPageSize());
initResults();
fetchQuery(query, tx);
}
protected EntityTransaction getTxOrNull() {
if (transacted) {
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.flush();
entityManager.clear();
return tx;
}
return null;
}
protected JPAQuery<T> createQuery() {
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
return queryFunction.apply(queryFactory);
}
protected void initResults() {
if (CollectionUtils.isEmpty(results)) {
results = new CopyOnWriteArrayList<>();
} else {
results.clear();
}
}
protected void fetchQuery(JPAQuery<T> query, EntityTransaction tx) {
if (transacted) {
results.addAll(query.fetch());
if(tx != null) {
tx.commit();
}
} else {
List<T> queryResult = query.fetch();
for (T entity : queryResult) {
entityManager.detach(entity);
results.add(entity);
}
}
}
@Override
protected void doJumpToPage(int itemIndex) {
}
@Override
protected void doClose() throws Exception {
entityManager.close();
super.doClose();
}
}
Я запустил проект выше, он выдает код ошибки, подобный этому.
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: School is not mapped [select school
from School school
По моему мнению, jpql не превращается в собственный запрос. но когда я использую jpaItemReader, тогда он работает и просто проект, а не модули.