次のように、JPASQLQuery API を介して SQL ケース式をセットアップしたいと考えています
。 Oracle SQL は次の とおりです。
SELECT h.ordercode
, h.requesteddeliverytime
, CASE
WHEN h.ordergroup IS NOT NULL
THEN g.minRequestedDeliveryTime
ELSE h.requesteddeliverytime
END AS earliest_del_time
FROM orderheader h LEFT JOIN (
SELECT
ordergroup
,MIN(requesteddeliverytime) as minRequestedDeliveryTime
FROM orderheader hh
GROUP BY orderGroup
) g ON h.ordergroup = g.ordergroup
正しい結果を提供します。CaseBuilder() をセットアップしようとすると、単純な が返さExpression
れ、JPASQLQuery では使用できなくなります (少なくとも、 でエイリアスを設定することはできません.as("someString")
)。
メタデータ クラスは次のようになります (短い形式)。
@Generated("com.mysema.query.sql.codegen.MetaDataSerializer")
public class SOrderheader extends com.mysema.query.sql.RelationalPathBase<SOrderheader> {
public final StringPath ordergroup = createString("ORDERGROUP");
public final DateTimePath<java.sql.Timestamp> requesteddeliverytime = createDateTime("REQUESTEDDELIVERYTIME", java.sql.Timestamp.class);
}
グループクエリは次のようになります。
ListSubQuery<Tuple> groupSubQuery = new SQLSubQuery()
.from(sOrderGroup)
.groupBy(sOrderGroup.ordergroup)
.list(new QTuple(
sOrderGroup.ordergroup.as("orderGroup"),
sOrderGroup.id.count().as("nofOrdersPerGroup"),
sOrderGroup.requesteddeliverytime.min().as("earliestDeliveryTime"),
));
CaseBuilder() ステートメント:
Expression<Timestamp> earliestDeliveryTime = new CaseBuilder()
.when(sOrderHeader.ordergroup.isNotNull()).then(og.getDate("earliestDeliveryTime", Date.class))
.otherwise(sOrderHeader.requesteddeliverytime);
さまざまな CASE 代替で異なる列を返すための手段や、CaseBuilder() から返される式にエイリアスを設定する可能性が必要です。どんな助けでも大歓迎です。