better QueryFactory

This commit is contained in:
devezhao 2021-06-01 14:36:42 +08:00
parent 83aba856cb
commit 37fb08f0a6
10 changed files with 43 additions and 32 deletions

2
@rbv

@ -1 +1 @@
Subproject commit ad1828130b1c15b1fe290c40ef6075c74b645225 Subproject commit de18c98f288d147234498a99c8aad54d31febba2

View file

@ -452,7 +452,7 @@ public class FormsBuilder extends FormsManager {
.append(" where ") .append(" where ")
.append(entity.getPrimaryField().getName()) .append(entity.getPrimaryField().getName())
.append(" = ?"); .append(" = ?");
return Application.getQueryFactory().createQuery(sql.toString(), user).setParameter(1, id).record(); return Application.createQuery(sql.toString(), user).setParameter(1, id).record();
} }
/** /**

View file

@ -73,7 +73,7 @@ public abstract class BulkOperator extends HeavyTask<Integer> {
entity.getPrimaryField().getName(), entity.getName(), sqlWhere); entity.getPrimaryField().getName(), entity.getName(), sqlWhere);
// NOTE 注意没有分页 // NOTE 注意没有分页
Query query = Application.getQueryFactory().createQuery(sql, context.getOpUser()); Query query = Application.createQuery(sql, context.getOpUser());
Object[][] array = QueryHelper.readArray(query); Object[][] array = QueryHelper.readArray(query);
Set<ID> ids = new HashSet<>(); Set<ID> ids = new HashSet<>();
for (Object[] o : array) { for (Object[] o : array) {

View file

@ -53,7 +53,7 @@ public class ProjectConfigService extends BaseConfigurationService implements Ad
@Override @Override
public int delete(ID projectId) { public int delete(ID projectId) {
Object[] count = Application.createQuery( Object[] count = Application.createQueryNoFilter(
"select count(taskId) from ProjectTask where projectId = ?") "select count(taskId) from ProjectTask where projectId = ?")
.setParameter(1, projectId) .setParameter(1, projectId)
.unique(); .unique();
@ -77,9 +77,12 @@ public class ProjectConfigService extends BaseConfigurationService implements Ad
// 使用模板 // 使用模板
if (useTemplate == TEMPLATE_DEFAULT) { if (useTemplate == TEMPLATE_DEFAULT) {
ID id1 = createPlan(project.getPrimary(), Language.L("待处理"), 1000, ProjectPlanConfigService.FLOW_STATUS_START, null); ID id1 = createPlan(project.getPrimary(),
ID id2 = createPlan(project.getPrimary(), Language.L("进行中"), 2000, ProjectPlanConfigService.FLOW_STATUS_PROCESSING, null); Language.L("待处理"), 1000, ProjectPlanConfigService.FLOW_STATUS_START, null);
ID id3 = createPlan(project.getPrimary(), Language.L("已完成"), 3000, ProjectPlanConfigService.FLOW_STATUS_END, new ID[]{id1, id2}); ID id2 = createPlan(project.getPrimary(),
Language.L("进行中"), 2000, ProjectPlanConfigService.FLOW_STATUS_PROCESSING, null);
ID id3 = createPlan(project.getPrimary(),
Language.L("已完成"), 3000, ProjectPlanConfigService.FLOW_STATUS_END, new ID[]{id1, id2});
updateFlowNexts(id1, new ID[]{id2, id3}); updateFlowNexts(id1, new ID[]{id2, id3});
updateFlowNexts(id2, new ID[]{id1, id3}); updateFlowNexts(id2, new ID[]{id1, id3});
} }

View file

@ -141,13 +141,13 @@ public class ProjectTaskService extends BaseTaskService {
*/ */
synchronized synchronized
private int getSeqInStatus(ID taskId, boolean desc) { private int getSeqInStatus(ID taskId, boolean desc) {
Object[] taskStatus = Application.createQuery( Object[] taskStatus = Application.createQueryNoFilter(
"select status,projectPlanId from ProjectTask where taskId = ?") "select status,projectPlanId from ProjectTask where taskId = ?")
.setParameter(1, taskId) .setParameter(1, taskId)
.unique(); .unique();
if (taskStatus == null) return 1; if (taskStatus == null) return 1;
Object[] seq = Application.createQuery( Object[] seq = Application.createQueryNoFilter(
"select " + (desc ? "max" : "min") + "(seq) from ProjectTask where status = ? and projectPlanId = ?") "select " + (desc ? "max" : "min") + "(seq) from ProjectTask where status = ? and projectPlanId = ?")
.setParameter(1, taskStatus[0]) .setParameter(1, taskStatus[0])
.setParameter(2, taskStatus[1]) .setParameter(2, taskStatus[1])

View file

@ -40,6 +40,7 @@ public class QueryFactory {
/** /**
* @param ajql * @param ajql
* @return * @return
* @see #createQueryNoFilter(String)
*/ */
public Query createQuery(String ajql) { public Query createQuery(String ajql) {
return createQuery(ajql, UserContextHolder.getUser()); return createQuery(ajql, UserContextHolder.getUser());
@ -54,14 +55,6 @@ public class QueryFactory {
return createQuery(ajql, Application.getPrivilegesManager().createQueryFilter(user)); return createQuery(ajql, Application.getPrivilegesManager().createQueryFilter(user));
} }
/**
* @param ajql
* @return
*/
public Query createQueryNoFilter(String ajql) {
return createQuery(ajql, RoleBaseQueryFilter.ALLOWED);
}
/** /**
* @param ajql * @param ajql
* @param filter * @param filter
@ -76,11 +69,25 @@ public class QueryFactory {
} }
/** /**
* @param sql * 1.无权限实体查询无权限实体使用 #createQuery 除管理员外将查不到数据
* 2.有权限实体查询单不应用角色权限
*
* @param ajql
* @return
* @see #createQuery(String)
*/
public Query createQueryNoFilter(String ajql) {
return createQuery(ajql, RoleBaseQueryFilter.ALLOWED);
}
/**
* 原生 SQL 查询
*
* @param rawSql
* @return * @return
*/ */
public NativeQuery createNativeQuery(String sql) { public NativeQuery createNativeQuery(String rawSql) {
return aPMFactory.createNativeQuery(sql) return aPMFactory.createNativeQuery(rawSql)
.setTimeout(QUERY_TIMEOUT) .setTimeout(QUERY_TIMEOUT)
.setSlowLoggerTime(SLOW_LOGGER_TIME); .setSlowLoggerTime(SLOW_LOGGER_TIME);
} }
@ -129,11 +136,6 @@ public class QueryFactory {
return createQueryNoFilter(sql).setParameter(1, recordId).unique(); return createQueryNoFilter(sql).setParameter(1, recordId).unique();
} }
/**
* @param recordId
* @param fields
* @return
*/
private String buildUniqueSql(ID recordId, String... fields) { private String buildUniqueSql(ID recordId, String... fields) {
Assert.notNull(recordId, "[recordId] cannot be null"); Assert.notNull(recordId, "[recordId] cannot be null");

View file

@ -117,7 +117,7 @@ public class FieldWriteback extends FieldAggregation {
} else { } else {
String sql = String.format("select %s from %s where %s = ?", String sql = String.format("select %s from %s where %s = ?",
targetEntity.getPrimaryField().getName(), targetFieldEntity[1], targetFieldEntity[0]); targetEntity.getPrimaryField().getName(), targetFieldEntity[1], targetFieldEntity[0]);
Object[][] array = Application.getQueryFactory().createQueryNoFilter(sql) Object[][] array = Application.createQueryNoFilter(sql)
.setParameter(1, operatingContext.getAnyRecord().getPrimary()) .setParameter(1, operatingContext.getAnyRecord().getPrimary())
.array(); .array();

View file

@ -127,7 +127,7 @@ public class BatchOperatorQuery extends SetUser {
int pageNo = queryData.getIntValue("pageNo"); int pageNo = queryData.getIntValue("pageNo");
int pageSize = queryData.getIntValue("pageSize"); int pageSize = queryData.getIntValue("pageSize");
Object[][] array = Application.getQueryFactory().createQuery(sql, getUser()) Object[][] array = Application.createQuery(sql, getUser())
.setLimit(pageSize, pageNo * pageSize - pageSize) .setLimit(pageSize, pageNo * pageSize - pageSize)
.setTimeout(60) .setTimeout(60)
.array(); .array();

View file

@ -66,11 +66,11 @@ public class DataListBuilderImpl implements DataListBuilder {
public JSON getJSONResult() { public JSON getJSONResult() {
int totalRows = 0; int totalRows = 0;
if (queryParser.isNeedReload()) { if (queryParser.isNeedReload()) {
Object[] count = Application.getQueryFactory().createQuery(queryParser.toCountSql(), user).unique(); Object[] count = Application.createQuery(queryParser.toCountSql(), user).unique();
totalRows = ObjectUtils.toInt(count[0]); totalRows = ObjectUtils.toInt(count[0]);
} }
Query query = Application.getQueryFactory().createQuery(queryParser.toSql(), user); Query query = Application.createQuery(queryParser.toSql(), user);
int[] limits = queryParser.getSqlLimit(); int[] limits = queryParser.getSqlLimit();
Object[][] data = query.setLimit(limits[0], limits[1]).array(); Object[][] data = query.setLimit(limits[0], limits[1]).array();

View file

@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test;
public class QueryFactoryTest extends TestSupport { public class QueryFactoryTest extends TestSupport {
@Test @Test
public void testBaseQuery() { void testBaseQuery() {
String sql = "select loginName from User"; String sql = "select loginName from User";
Filter filter = Application.getPrivilegesManager().createQueryFilter(SIMPLE_USER); Filter filter = Application.getPrivilegesManager().createQueryFilter(SIMPLE_USER);
Object[][] array = Application.getQueryFactory().createQuery(sql, filter).array(); Object[][] array = Application.getQueryFactory().createQuery(sql, filter).array();
@ -33,7 +33,7 @@ public class QueryFactoryTest extends TestSupport {
} }
@Test @Test
public void testQueryAllDT() { void testQueryAllDT() {
Entity allDT = MetadataHelper.getEntity(TestAllFields); Entity allDT = MetadataHelper.getEntity(TestAllFields);
StringBuilder sql = new StringBuilder("select "); StringBuilder sql = new StringBuilder("select ");
for (Field f : allDT.getFields()) { for (Field f : allDT.getFields()) {
@ -51,8 +51,14 @@ public class QueryFactoryTest extends TestSupport {
} }
@Test @Test
public void testNoUser() { void testNoUser() {
Assertions.assertThrows(AccessDeniedException.class, Assertions.assertThrows(AccessDeniedException.class,
() -> Application.getQueryFactory().createQuery("select loginName from User").array()); () -> Application.getQueryFactory().createQuery("select loginName from User").array());
} }
@Test
void createNativeQuery() {
Object[] x = Application.getQueryFactory().createNativeQuery("select current_date").unique();
System.out.println(x[0]);
}
} }