Java QueryDSL使用本机SQL连接和子查询

Java QueryDSL使用本机SQL连接和子查询,java,spring-data,querydsl,native-sql,Java,Spring Data,Querydsl,Native Sql,我使用Spring数据和QueryDSL 3.2.4,并希望使用QueryDSL本机SQL API实现以下SQL查询: WITH ORDER_GROUP AS ( -- TODO have to merge this subquery into the main query SELECT ordergroup ,count(ID) AS nofOrdersPerGroup ,MIN(priority) as minPriority

我使用Spring数据和QueryDSL 3.2.4,并希望使用QueryDSL本机SQL API实现以下SQL查询:

WITH ORDER_GROUP AS (   -- TODO have to merge this subquery into the main query
    SELECT 
        ordergroup
       ,count(ID) AS nofOrdersPerGroup 
       ,MIN(priority) as minPriority
       ,MIN(requesteddeliverytime) as minRequestedDeliveryTime
       ,MIN(creationtime) as minCreationTime
      FROM ORDERHEADER hh
     group by orderGroup      
),
ALL_ORDERS AS (   -- TODO have to merge this subquery into the main query
    SELECT h.ordercode
      , h.ordergroup
      , h.priority
      , h.requesteddeliverytime
      , h.creationtime
      , h.statecode
      , (SELECT COUNT(ID)
           FROM orderposition p
          WHERE p.orderheaderid = h.ID
        ) AS nof_positions_per_order
      , CASE
            WHEN h.ordergroup IS NOT NULL
            THEN g.nofOrdersPerGroup
            ELSE 1
        END AS nof_orders_per_group
      , CASE
            WHEN h.ordergroup IS NOT NULL
            THEN g.minPriority
            ELSE h.priority
        END AS most_important_prio
      , CASE
            WHEN h.ordergroup IS NOT NULL
            THEN g.minRequestedDeliveryTime
            ELSE h.requesteddeliverytime
        END AS earliest_del_time
      , CASE
            WHEN h.ordergroup IS NOT NULL
            THEN g.minCreationTime
            ELSE h.creationtime
        END AS earliest_cre_time
       FROM ORDERHEADER h left outer join ORDER_GROUP g on h.ordergroup = g.ordergroup
      WHERE 1=1  -- TODO have to add filter clauses here
)
 SELECT ordercode
  , ordergroup
  , priority
  , requesteddeliverytime
  , creationtime
  , statecode
  , nof_positions_per_order
  , nof_orders_per_group
  , most_important_prio
  , earliest_del_time
  , earliest_cre_time
   FROM ALL_ORDERS
ORDER BY most_important_prio
  , earliest_del_time
  , earliest_cre_time
  , priority
  , requesteddeliverytime
  , creationtime;
联接不在FK列上,而是在子查询顺序组的某个任意属性上。此子查询聚合OrderHeader上的一些最小值/最大值,以便稍后在排序中使用

查询类型包括:

package com.stoecklin.wms.entity;

import static com.mysema.query.types.PathMetadataFactory.*;

import com.mysema.query.types.path.*;

import com.mysema.query.types.PathMetadata;
import javax.annotation.Generated;
import com.mysema.query.types.Path;
import com.mysema.query.types.path.PathInits;


/**
 * QOrderHeader is a Querydsl query type for OrderHeader
 */
@Generated("com.mysema.query.codegen.EntitySerializer")
public class QOrderHeader extends EntityPathBase<OrderHeader> {

    private static final long serialVersionUID = 2006939562;
    public static final QOrderHeader orderHeader = new QOrderHeader("orderHeader");
    public final com.stoecklin.utility.database.QBaseEntity _super = new com.stoecklin.utility.database.QBaseEntity(this);
    public final DateTimePath<java.util.Date> actualDeliveryTime = createDateTime("actualDeliveryTime", java.util.Date.class);
    public final StringPath creationMode = createString("creationMode");
    //inherited
    public final DateTimePath<java.util.Date> creationTime = _super.creationTime;
    public final StringPath customerCode = createString("customerCode");
    public final StringPath customerOrderCode = createString("customerOrderCode");
    public final StringPath deliveryCode = createString("deliveryCode");
    public final StringPath deliveryNote = createString("deliveryNote");
    public final StringPath headerText = createString("headerText");
    public final NumberPath<Integer> hostId = createNumber("hostId", Integer.class);
    public final NumberPath<Long> id = createNumber("id", Long.class);
    //inherited
    public final DateTimePath<java.util.Date> lastUpdateTime = _super.lastUpdateTime;
    public final StringPath orderCode = createString("orderCode");
    public final StringPath orderGroup = createString("orderGroup");
    public final ListPath<OrderPosition, QOrderPosition> orderPositions = this.<OrderPosition, QOrderPosition>createList("orderPositions", OrderPosition.class, QOrderPosition.class, PathInits.DIRECT2);
    public final StringPath orderTypeCode = createString("orderTypeCode");
    public final StringPath priority = createString("priority");
    public final DateTimePath<java.util.Date> requestedDeliveryTime = createDateTime("requestedDeliveryTime", java.util.Date.class);
    public final StringPath setupType = createString("setupType");
    public final StringPath shippingMode = createString("shippingMode");
    public final StringPath stagingArea = createString("stagingArea");
    public final EnumPath<com.stoecklin.wms.enums.OrderHeaderState> stateCode = createEnum("stateCode", com.stoecklin.wms.enums.OrderHeaderState.class);
    public final StringPath stateReason = createString("stateReason");
    public final DateTimePath<java.util.Date> stateTime = createDateTime("stateTime", java.util.Date.class);
    //inherited
    public final NumberPath<Long> version = _super.version;

    public QOrderHeader(String variable) {
        super(OrderHeader.class, forVariable(variable));
    }

    public QOrderHeader(Path<? extends OrderHeader> path) {
        super(path.getType(), path.getMetadata());
    }

    public QOrderHeader(PathMetadata<?> metadata) {
        super(OrderHeader.class, metadata);
    }

}
package com.stoecklin.wms.entity;
导入静态com.mysema.query.types.PathMetadataFactory.*;
导入com.mysema.query.types.path.*;
导入com.mysema.query.types.PathMetadata;
导入javax.annotation.Generated;
导入com.mysema.query.types.Path;
导入com.mysema.query.types.path.PathInits;
/**
*QOrderHeader是OrderHeader的Querydsl查询类型
*/
@生成(“com.mysema.query.codegen.EntitySerializer”)
公共类QOrderHeader扩展了EntityPathBase{
私有静态最终长serialVersionUID=2006939562;
公共静态最终QOrderHeader orderHeader=新QOrderHeader(“orderHeader”);
public final com.stoecklin.utility.database.QBaseEntity _super=new com.stoecklin.utility.database.QBaseEntity(this);
公共最终日期时间路径actualDeliveryTime=createDateTime(“actualDeliveryTime”,java.util.Date.class);
公共最终StringPath creationMode=createString(“creationMode”);
//继承的
public final DateTimePath creationTime=\u super.creationTime;
公共最终StringPath customerCode=createString(“customerCode”);
公共最终StringPath customerOrderCode=createString(“customerOrderCode”);
公共最终StringPath deliveryCode=createString(“deliveryCode”);
公共最终StringPath deliveryNote=createString(“deliveryNote”);
公共最终StringPath headerText=createString(“headerText”);
public final NumberPath hostId=createNumber(“hostId”,Integer.class);
public final NumberPath id=createNumber(“id”,Long.class);
//继承的
public final DateTimePath lastUpdateTime=\u super.lastUpdateTime;
公共最终StringPath orderCode=createString(“orderCode”);
公共最终StringPath orderGroup=createString(“orderGroup”);
public final ListPath orderPositions=this.createList(“orderPositions”,OrderPosition.class,QOrderPosition.class,PathInits.DIRECT2);
公共最终StringPath orderTypeCode=createString(“orderTypeCode”);
公共最终StringPath优先级=createString(“优先级”);
公共最终日期时间路径requestedDeliveryTime=createDateTime(“requestedDeliveryTime”,java.util.Date.class);
公共最终StringPath setupType=createString(“setupType”);
公共最终StringPath shippingMode=createString(“shippingMode”);
公共最终StringPath StaginArea=createString(“StaginArea”);
public final EnumPath stateCode=createEnum(“stateCode”,com.stoecklin.wms.enums.OrderHeaderState.class);
公共最终StringPath stateReason=createString(“stateReason”);
public final DateTimePath stateTime=createDateTime(“stateTime”,java.util.Date.class);
//继承的
公共最终编号路径版本=_super.version;
公共QOrderHeader(字符串变量){
super(OrderHeader.class,forVariable(variable));
}
公共QOrderHeader(路径元数据){
super(OrderHeader.class,元数据);
}
}

package com.stoecklin.wms.entity;
导入静态com.mysema.query.types.PathMetadataFactory.*;
导入com.mysema.query.types.path.*;
导入com.mysema.query.types.PathMetadata;
导入javax.annotation.Generated;
导入com.mysema.query.types.Path;
导入com.mysema.query.types.path.PathInits;
/**
*QOrderPosition是OrderPosition的Querydsl查询类型
*/
@生成(“com.mysema.query.codegen.EntitySerializer”)
公共类QOrderPosition扩展了EntityPathBase{
私有静态最终长serialVersionUID=2091670278;
私有静态final PathInits INITS=PathInits.DIRECT2;
公共静态最终QOrderPosition orderPosition=新QOrderPosition(“orderPosition”);
public final com.stoecklin.utility.database.QBaseEntity _super=new com.stoecklin.utility.database.QBaseEntity(this);
公共最终StringPath articleCode=createString(“articleCode”);
//继承的
public final DateTimePath creationTime=\u super.creationTime;
公共最终编号Path customerOrderPos=createNumber(“customerOrderPos”,Integer.class);
公共最终编号Path deliveredQuantity=createNumber(“deliveredQuantity”,Float.class);
public final StringPath fromWarehouseCode=createString(“fromWarehouseCode”);
公共最终StringPath hostData=createString(“hostData”);
公共最终StringPath hostRef=createString(“hostRef”);
public final NumberPath id=createNumber(“id”,Long.class);
//继承的
public final DateTimePath lastUpdateTime=\u super.lastUpdateTime;
公共最终StringPath lotCode=createString(“lotCode”);
public final NumberPath missingQuantity=createNumber(“missingQuantity”,Float.class);
公共最终QOrderHeader订单头;
public final NumberPath orderPos=createNumber(“orderPos”,Integer.class);
公共最终StringPath所有者代码=createString(“所有者代码”);
公共最终StringPath posText=createString(“posText”);
public final NumberPath requestedQuantity=createNumber(“requestedQuantity”,Float.class);
public final EnumPath stateCode=createEnum(“stateCode”,com.stoecklin.wms.enums.OrderPositionState.class);
公共最终StringPath stateReason=createString(“stateReason”);
public final DateTimePath stateTime=createDateTime(“stateTime”,java.util.Date.class);
公共最终StringPath toBePicked=createString(“toBePicked”);
公共最终StringPath toLocation=createString(“toLocation”);
//继承的
公共最终编号路径版本=_super.version;
公共QORDERPOSION(字符串变量){
这(OrderPosition.class、forVariable(variable)、INITS);
}
公共QOrderPosition(路径元数据){
这(元数据、元数据)
package com.stoecklin.wms.entity;

import static com.mysema.query.types.PathMetadataFactory.*;

import com.mysema.query.types.path.*;

import com.mysema.query.types.PathMetadata;
import javax.annotation.Generated;
import com.mysema.query.types.Path;
import com.mysema.query.types.path.PathInits;


/**
 * QOrderPosition is a Querydsl query type for OrderPosition
 */
@Generated("com.mysema.query.codegen.EntitySerializer")
public class QOrderPosition extends EntityPathBase<OrderPosition> {

    private static final long serialVersionUID = 2091670278;
    private static final PathInits INITS = PathInits.DIRECT2;
    public static final QOrderPosition orderPosition = new QOrderPosition("orderPosition");
    public final com.stoecklin.utility.database.QBaseEntity _super = new com.stoecklin.utility.database.QBaseEntity(this);
    public final StringPath articleCode = createString("articleCode");
    //inherited
    public final DateTimePath<java.util.Date> creationTime = _super.creationTime;
    public final NumberPath<Integer> customerOrderPos = createNumber("customerOrderPos", Integer.class);
    public final NumberPath<Float> deliveredQuantity = createNumber("deliveredQuantity", Float.class);
    public final StringPath fromWarehouseCode = createString("fromWarehouseCode");
    public final StringPath hostData = createString("hostData");
    public final StringPath hostRef = createString("hostRef");
    public final NumberPath<Long> id = createNumber("id", Long.class);
    //inherited
    public final DateTimePath<java.util.Date> lastUpdateTime = _super.lastUpdateTime;
    public final StringPath lotCode = createString("lotCode");
    public final NumberPath<Float> missingQuantity = createNumber("missingQuantity", Float.class);
    public final QOrderHeader orderHeader;
    public final NumberPath<Integer> orderPos = createNumber("orderPos", Integer.class);
    public final StringPath ownerCode = createString("ownerCode");
    public final StringPath posText = createString("posText");
    public final NumberPath<Float> requestedQuantity = createNumber("requestedQuantity", Float.class);
    public final EnumPath<com.stoecklin.wms.enums.OrderPositionState> stateCode = createEnum("stateCode", com.stoecklin.wms.enums.OrderPositionState.class);
    public final StringPath stateReason = createString("stateReason");
    public final DateTimePath<java.util.Date> stateTime = createDateTime("stateTime", java.util.Date.class);
    public final StringPath toBePicked = createString("toBePicked");
    public final StringPath toLocation = createString("toLocation");
    //inherited
    public final NumberPath<Long> version = _super.version;

    public QOrderPosition(String variable) {
        this(OrderPosition.class, forVariable(variable), INITS);
    }

    public QOrderPosition(Path<? extends OrderPosition> path) {
        this(path.getType(), path.getMetadata(), path.getMetadata().isRoot() ? INITS : PathInits.DEFAULT);
    }

    public QOrderPosition(PathMetadata<?> metadata) {
        this(metadata, metadata.isRoot() ? INITS : PathInits.DEFAULT);
    }

    public QOrderPosition(PathMetadata<?> metadata, PathInits inits) {
        this(OrderPosition.class, metadata, inits);
    }

    public QOrderPosition(Class<? extends OrderPosition> type, PathMetadata<?> metadata, PathInits inits) {
        super(type, metadata, inits);
        this.orderHeader = inits.isInitialized("orderHeader") ? new QOrderHeader(forProperty("orderHeader")) : null;
    }

}
QOrderHeader orderHeader = QOrderHeader.orderHeader;
QOrderHeader orderHeaderGroup = new QOrderHeader("orderHeaderGroup");
QOrderPosition orderPosition = QOrderPosition.orderPosition;

List<Tuple> tuples = query.from(orderHeader)
        .leftJoin(orderHeader, orderHeaderGroup).on(orderHeader.orderGroup.eq(orderHeaderGroup.orderGroup))
        .list(
                orderHeader.orderGroup,
                orderHeader.id
              );
from(h).leftJoin(g).on(h.ordergroup.eq(g.ordergroup))
new CaseBuilder()
    .when(h.ordergroup.isNotNull()).then(g.nofOrderPerGroup)
    .otherwise(1)
query.join(entity.property, reference)
query.join(table).on(condition)
query.join(table.fk, otherTable)