net.ibizsys.model.engine.querydsl.database.sql.QuerydslSQLGenEngine Maven / Gradle / Ivy
The newest version!
package net.ibizsys.model.engine.querydsl.database.sql;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.sql.Configuration;
import com.querydsl.sql.DB2Templates;
import com.querydsl.sql.MySQLTemplates;
import com.querydsl.sql.OracleTemplates;
import com.querydsl.sql.PostgreSQLTemplates;
import com.querydsl.sql.SQLBindings;
import com.querydsl.sql.SQLQuery;
import com.querydsl.sql.SQLServer2012Templates;
import com.querydsl.sql.SQLiteTemplates;
import net.ibizsys.model.PSModelEnums.DBType;
import net.ibizsys.model.dataentity.ds.IPSDEDataQuery;
import net.ibizsys.model.engine.IPSModelEngine;
import net.ibizsys.model.engine.database.sql.SQLGenEngineBase;
public class QuerydslSQLGenEngine extends SQLGenEngineBase> {
@Override
public String getName() {
return this.getDBType();
}
@Override
public String getFullName() {
return String.format("QuerydslSQL代码生成器[%1$s]", this.getName());
}
protected SQLQuery createSQLQuery() throws Exception{
if(DBType.MYSQL5.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(MySQLTemplates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.ORACLE.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(OracleTemplates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.SQLSERVER.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(SQLServer2012Templates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.DB2.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(DB2Templates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.POSTGRESQL.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(PostgreSQLTemplates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.SQLITE.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(SQLiteTemplates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
if(DBType.PPAS.value.equalsIgnoreCase(this.getDBType())) {
Configuration configuration = new Configuration(OracleTemplates.DEFAULT);
configuration.setUseLiterals(true);
return new SQLQuery(configuration);
}
throw new Exception(String.format("未支持的数据库类型[%1$s]", this.getDBType()));
}
@Override
protected String onGenerate(IPSDEDataQuery iPSDEDataQuery, Map params) throws Throwable {
QuerydslDEDataQuery querydslDEDataQuery = new QuerydslDEDataQuery(new QuerydslSession(params), iPSDEDataQuery);
SQLQuery sqlQuery = createSQLQuery();
List> expressions = new ArrayList>();
for(String name : querydslDEDataQuery.getExpressionNames()) {
expressions.add(Expressions.as(querydslDEDataQuery.getExpression(name, false), name));
}
sqlQuery.select(expressions.toArray(new Expression[expressions.size()]));
sqlQuery.from(querydslDEDataQuery.getQuerydslDataEntity());
join(sqlQuery, querydslDEDataQuery.getQuerydslDataEntity());
where(sqlQuery, querydslDEDataQuery.getQuerydslDataEntity());
SQLBindings sqlBindings = sqlQuery.getSQL();
return sqlBindings.getSQL();
}
protected void join(SQLQuery sqlQuery, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
java.util.Collection querydslDEJoinList = iQuerydslDataEntity.getQuerydslDEJoins();
if(querydslDEJoinList!=null) {
for(IQuerydslDEJoin iQuerydslDEJoin : querydslDEJoinList) {
switch(iQuerydslDEJoin.getJoinType()) {
case IQuerydslDEJoin.JOINTYPE_LEFTJOIN:
sqlQuery.leftJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
break;
case IQuerydslDEJoin.JOINTYPE_INNERJOIN:
sqlQuery.innerJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
break;
case IQuerydslDEJoin.JOINTYPE_RIGHTJOIN:
sqlQuery.rightJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
break;
case IQuerydslDEJoin.JOINTYPE_EXISTS:
case IQuerydslDEJoin.JOINTYPE_NOTEXISTS:
break;
default:
throw new Exception(String.format("无法识别的连接类型[%1$s]", iQuerydslDEJoin.getJoinType()));
}
}
}
}
protected void where(SQLQuery sqlQuery, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
List predicateList = new ArrayList();
fillPredicates(predicateList, iQuerydslDataEntity);
if(predicateList.size() > 0) {
sqlQuery.where(predicateList.toArray(new Predicate[predicateList.size()]));
}
}
protected void fillPredicates(List predicateList, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
java.util.Collection list = iQuerydslDataEntity.getPredicates();
if(list != null) {
predicateList.addAll(list);
}
java.util.Collection querydslDEJoinList = iQuerydslDataEntity.getQuerydslDEJoins();
if(querydslDEJoinList!=null) {
for(IQuerydslDEJoin iQuerydslDEJoin : querydslDEJoinList) {
switch(iQuerydslDEJoin.getJoinType()) {
case IQuerydslDEJoin.JOINTYPE_EXISTS:
case IQuerydslDEJoin.JOINTYPE_NOTEXISTS:
//构建子条件
SQLQuery sqlQuery = createSQLQuery();
sqlQuery.from(iQuerydslDEJoin.getJoinQuerydslDataEntity());
join(sqlQuery, iQuerydslDEJoin.getJoinQuerydslDataEntity());
where(sqlQuery, iQuerydslDEJoin.getJoinQuerydslDataEntity());
if(IQuerydslDEJoin.JOINTYPE_EXISTS.equals(iQuerydslDEJoin.getJoinType())) {
predicateList.add(sqlQuery.exists());
}
else {
predicateList.add(sqlQuery.notExists());
}
break;
default:
fillPredicates(predicateList, iQuerydslDEJoin.getJoinQuerydslDataEntity());
}
}
}
}
}