
net.cassite.daf4j.jpa.JPQLAroundParser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of daf4j-ds-jpa Show documentation
Show all versions of daf4j-ds-jpa Show documentation
A library provides implementation of DAF4J DataAccess using JPA
The newest version!
package net.cassite.daf4j.jpa;
import net.cassite.daf4j.*;
import net.cassite.daf4j.ds.AroundParser;
import net.cassite.daf4j.ds.DSUtils;
import net.cassite.daf4j.ds.ObjectResolver;
import net.cassite.daf4j.ds.ParserPacket;
import net.cassite.daf4j.util.ConstantMap;
import net.cassite.daf4j.util.Location;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Around型解释器,将获取信息转化为JPQL
*/
public class JPQLAroundParser implements AroundParser {
private static final String aliasPrefix = "var";
private ParserPacket parserPacket;
/**
* 直接在manager中执行find方法
*
* @param manager EntityManager对象
* @param aClass 要查询的类型
* @param o 主键
* @param 要查询的类型
* @return 查询结果
* @throws Exception 由jpa抛出的异常
*/
@Override
public En find(EntityManager manager, Class aClass, Object o) throws Exception {
return manager.find(aClass, o);
}
/**
* 构造JPQLContext
*
* @param manager EntityManager对象
* @param o 要查询的实体
* @param where 条件子句
* @param queryParameter 查询参数
* @return 生成的上下文
* @throws Exception 由jpa抛出的异常
*/
@Override
public JPQLContext initiateList(EntityManager manager, Object o, Where where, QueryParameter queryParameter) throws Exception {
JPQLContext context = new JPQLContext(manager, o, aliasPrefix);
context.NoDistinctOrAlreadyDone = queryParameter == null || !queryParameter.parameters.containsKey(QueryParameterTypes.distinct);
return context;
}
/**
* 生成完整SELECT子句
*
* @param jpqlContext 上下文
* @return 上下文
* @throws Exception 可能的异常
*/
@Override
public JPQLContext beforeParsingList(JPQLContext jpqlContext) throws Exception {
String alias = jpqlContext.aliasMap.get(new Location(null));
jpqlContext.frontQueries = new StringBuilder("SELECT ");
if (!jpqlContext.NoDistinctOrAlreadyDone) {
jpqlContext.frontQueries.append("DISTINCT ");
}
jpqlContext.frontQueries.append(alias);
jpqlContext.selectNonAggregationAliases.add(alias);
return jpqlContext;
}
/**
* 执行todoList后连接frontQuery到generalJPQL后返回上下文
*
* @param jpqlContext 上下文
* @return 上下文
* @throws Exception 由jpa抛出的异常
*/
@Override
public JPQLContext afterParsingList(JPQLContext jpqlContext) throws Exception {
for (JPQLToDo todo : jpqlContext.toDoAfterJPQLGeneration) {
todo.todo(jpqlContext);
}
jpqlContext.generalJPQL.insert(0, jpqlContext.frontQueries);
return jpqlContext;
}
/**
* 根据generalJPQL生成Query,执行每一条JPQLToDo,填入常量,执行jpaQuery.getResultList()
*
* @param jpqlContext 上下文
* @return 执行结果
* @throws Exception jpa抛出的异常
*/
@Override
public List> executeList(JPQLContext jpqlContext) throws Exception {
jpqlContext.jpaQuery = jpqlContext.manager.createQuery(jpqlContext.generalJPQL.toString());
for (JPQLToDo todo : jpqlContext.toDoAfterJPAQueryGeneration) {
todo.todo(jpqlContext);
}
// CONSTANTS
for (Integer i : jpqlContext.constantMap.keySet()) {
jpqlContext.jpaQuery.setParameter(i, jpqlContext.constantMap.get(i));
}
return jpqlContext.jpaQuery.getResultList();
}
/**
* 默认构造JPQLContext
*
* @param manager EntityManager对象
* @param o 要查询的实体
* @param where 查询条件
* @param queryParameterWithFocus 带focus的查询参数
* @return 上下文
* @throws Exception 可能抛出的异常
*/
@Override
public JPQLContext initiateProjection(EntityManager manager, Object o, Where where, QueryParameterWithFocus queryParameterWithFocus) throws Exception {
JPQLContext context = new JPQLContext(manager, o, aliasPrefix);
context.NoDistinctOrAlreadyDone = !queryParameterWithFocus.parameters.containsKey(QueryParameterTypes.distinct);
context.focusMap = queryParameterWithFocus.focusMap;
return context;
}
/**
* 不执行操作直接返回上下文
*
* @param jpqlContext 上下文
* @return 上下文
* @throws Exception 可能的异常
*/
@Override
public JPQLContext beforeParsingProjection(JPQLContext jpqlContext) throws Exception {
return jpqlContext;
}
/**
* 执行todoList,插入select子句
*
* @param jpqlContext 上下文
* @return 查询结果
* @throws Exception jpa抛出的异常
*/
@Override
public JPQLContext afterParsingProjection(JPQLContext jpqlContext) throws Exception {
for (JPQLToDo todo : jpqlContext.toDoAfterJPQLGeneration) {
todo.todo(jpqlContext);
}
jpqlContext.generalJPQL.insert(0, jpqlContext.frontQueries);
return jpqlContext;
}
/**
* 执行TODOList,放入常量,执行查询,并将结果转化为LIST[MAP]
*
* @param jpqlContext 上下文
* @return 查询结果
* @throws Exception jpa抛出的异常
*/
@Override
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy