Java JPA2.0标准API:使用大小写和子查询子句进行选择

Java JPA2.0标准API:使用大小写和子查询子句进行选择,java,mysql,hibernate,jpa,criteria-api,Java,Mysql,Hibernate,Jpa,Criteria Api,首先,对于这篇冗长的帖子,我很抱歉,但这是一个复杂的问题 private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder, final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) { // Selec

首先,对于这篇冗长的帖子,我很抱歉,但这是一个复杂的问题

private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder,
        final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) {
    // Select max(a.rap_ver_doc) From rap_pedido a Where a.rap_num_doc = pedido0_.rap_num_doc and a.rap_cod_tip_doc = pedido0_.rap_cod_tip_doc and
    // a.edo_cod_est_doc > 3 and not exists ...
    final Subquery<Integer> subqueryUltimaVersaoSubmetida = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersaoSubmetida.from(Pedido.class);

    subqueryUltimaVersaoSubmetida.select(builder.max(fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento)));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    // Considera todos os pedidos cujo estado seja igual ou maior ao estado passado como argumento
    adicionarWhereGreaterThanOrEqualTo(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento),
            EstadoDocumentoPedido.SUBMETIDO.getId());

    builder.not(builder.exists(criarSubqueryExisteDocumentoCriado(builder, query, fromUltimaVersaoPedido)));

    subqueryUltimaVersaoSubmetida.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersaoSubmetida;
}

private Subquery<Integer> criarSubqueryExisteDocumentoCriado(CriteriaBuilder builder, CriteriaQuery<Pedido> query, Root<Pedido> fromPedido) {
    // select 1 from rap_pedido b where b.rap_cod_tip_doc = a.rap_cod_tip_doc and b.rap_num_doc = a.rap_num_doc and b.rap_ver_doc > a.rap_ver_doc
    // and b.edo_cod_est_doc > 0
    final Subquery<Integer> subqueryUltimaVersao = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersao.from(Pedido.class);

    subqueryUltimaVersao.select(builder.literal(1));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento), 0);

    subqueryUltimaVersao.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersao;
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna1, Expression<?> coluna2) {
    where.add(builder.equal(coluna1, coluna2));
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna, Object parametro) {
    where.add(builder.equal(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThanOrEqualTo(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThan(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}
我们的产品目前使用criteria api进行以下工作查询:

SELECT
    pedido0_.rap_num_doc as col_0_0_,
    pedido0_.rap_cod_tip_doc as col_0_1_,
    pedido0_.rap_ver_doc as col_0_2_,
    pedido0_.edo_cod_est_doc as col_1_0_,
    pedido0_.tip_can as col_2_0_,
    pedido0_.num_pro_rea as col_3_0_,
    pedido0_.cod_uti_ges_ped as col_4_0_,
    pedido0_.nom_ges_ped as col_5_0_,
    pedido0_.dte_nifap as col_6_0_,
    pedido0_.nom_tit as col_7_0_,
    pedido0_.cod_uti_cri as col_8_0_,
    pedido0_.uor_cod_uni_org as col_9_0_,
    pedido0_.chv_cod_tip_ped as col_10_0_,
    estadopedi3_.cod_est_ped as col_11_0_,
    procedimen1_.cod_pro_ped as col_12_0_,
    tipodecisa2_.cod_tip_dec_ped as col_13_0_,
    pedido0_.uti_codigo as col_14_0_ 
FROM
    rap_pedido pedido0_ 
LEFT OUTER JOIN
    rap_pro_ped procedimen1_ 
        on pedido0_.chv_cod_pro_ped=procedimen1_.cod_pro_ped 
LEFT OUTER JOIN
    rap_tip_dec_ped tipodecisa2_ 
        on pedido0_.chv_cod_tip_dec_ped=tipodecisa2_.cod_tip_dec_ped 
LEFT OUTER JOIN
    rap_est_ped estadopedi3_ 
        on pedido0_.chv_cod_est_ped=estadopedi3_.cod_est_ped 
INNER JOIN
    rap_tip_ped tipopedido4_ 
        on pedido0_.chv_cod_tip_ped=tipopedido4_.cod_tip_ped 
WHERE
    pedido0_.dte_nif=? 
private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder,
        final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) {
    // Select max(a.rap_ver_doc) From rap_pedido a Where a.rap_num_doc = pedido0_.rap_num_doc and a.rap_cod_tip_doc = pedido0_.rap_cod_tip_doc and
    // a.edo_cod_est_doc > 3 and not exists ...
    final Subquery<Integer> subqueryUltimaVersaoSubmetida = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersaoSubmetida.from(Pedido.class);

    subqueryUltimaVersaoSubmetida.select(builder.max(fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento)));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    // Considera todos os pedidos cujo estado seja igual ou maior ao estado passado como argumento
    adicionarWhereGreaterThanOrEqualTo(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento),
            EstadoDocumentoPedido.SUBMETIDO.getId());

    builder.not(builder.exists(criarSubqueryExisteDocumentoCriado(builder, query, fromUltimaVersaoPedido)));

    subqueryUltimaVersaoSubmetida.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersaoSubmetida;
}

private Subquery<Integer> criarSubqueryExisteDocumentoCriado(CriteriaBuilder builder, CriteriaQuery<Pedido> query, Root<Pedido> fromPedido) {
    // select 1 from rap_pedido b where b.rap_cod_tip_doc = a.rap_cod_tip_doc and b.rap_num_doc = a.rap_num_doc and b.rap_ver_doc > a.rap_ver_doc
    // and b.edo_cod_est_doc > 0
    final Subquery<Integer> subqueryUltimaVersao = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersao.from(Pedido.class);

    subqueryUltimaVersao.select(builder.literal(1));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento), 0);

    subqueryUltimaVersao.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersao;
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna1, Expression<?> coluna2) {
    where.add(builder.equal(coluna1, coluna2));
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna, Object parametro) {
    where.add(builder.equal(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThanOrEqualTo(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThan(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}
我的目标是对select子句中的查询进行以下更改(添加了CASE语句):

private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder,
        final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) {
    // Select max(a.rap_ver_doc) From rap_pedido a Where a.rap_num_doc = pedido0_.rap_num_doc and a.rap_cod_tip_doc = pedido0_.rap_cod_tip_doc and
    // a.edo_cod_est_doc > 3 and not exists ...
    final Subquery<Integer> subqueryUltimaVersaoSubmetida = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersaoSubmetida.from(Pedido.class);

    subqueryUltimaVersaoSubmetida.select(builder.max(fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento)));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    // Considera todos os pedidos cujo estado seja igual ou maior ao estado passado como argumento
    adicionarWhereGreaterThanOrEqualTo(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento),
            EstadoDocumentoPedido.SUBMETIDO.getId());

    builder.not(builder.exists(criarSubqueryExisteDocumentoCriado(builder, query, fromUltimaVersaoPedido)));

    subqueryUltimaVersaoSubmetida.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersaoSubmetida;
}

private Subquery<Integer> criarSubqueryExisteDocumentoCriado(CriteriaBuilder builder, CriteriaQuery<Pedido> query, Root<Pedido> fromPedido) {
    // select 1 from rap_pedido b where b.rap_cod_tip_doc = a.rap_cod_tip_doc and b.rap_num_doc = a.rap_num_doc and b.rap_ver_doc > a.rap_ver_doc
    // and b.edo_cod_est_doc > 0
    final Subquery<Integer> subqueryUltimaVersao = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersao.from(Pedido.class);

    subqueryUltimaVersao.select(builder.literal(1));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento), 0);

    subqueryUltimaVersao.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersao;
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna1, Expression<?> coluna2) {
    where.add(builder.equal(coluna1, coluna2));
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna, Object parametro) {
    where.add(builder.equal(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThanOrEqualTo(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThan(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}
为了实现这一点,我使用以下代码修改了当前的select子句:

// Begin new code
Subquery<Integer> subqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado = criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(builder,
        query, fromPedido);
Case<Boolean> booleanCase = builder.<Boolean> selectCase();
Predicate versaoIgual = builder.equal(fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
        subqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado);
Expression<Boolean> isSubstituicaoPermitida = booleanCase.when(versaoIgual, true).otherwise(false);
// End new code

query.select(builder.construct(Pedido.class, fromPedido.get(Pedido_.id), fromPedido.get(Pedido_.estadoDocumento),
        fromPedido.get(Pedido_.tipoCandidatura), fromPedido.get(Pedido_.numeroProcesso), fromPedido.get(Pedido_.utilizadorGestor),
        fromPedido.get(Pedido_.nomeGestor), fromPedido.get(Pedido_.nifapBeneficiario), fromPedido.get(Pedido_.nomeTitular),
        fromPedido.get(Pedido_.utilizadorCriacao), fromPedido.get(Pedido_.unidadeOrganicaBeneficiario), fromPedido.get(Pedido_.tipoPedido),
        joinEstadoPedido, joinProcedimento, joinTipoDecisao, fromPedido.get(Pedido_.utilizadorProprietario), isSubstituicaoPermitida));
private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder,
        final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) {
    // Select max(a.rap_ver_doc) From rap_pedido a Where a.rap_num_doc = pedido0_.rap_num_doc and a.rap_cod_tip_doc = pedido0_.rap_cod_tip_doc and
    // a.edo_cod_est_doc > 3 and not exists ...
    final Subquery<Integer> subqueryUltimaVersaoSubmetida = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersaoSubmetida.from(Pedido.class);

    subqueryUltimaVersaoSubmetida.select(builder.max(fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento)));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    // Considera todos os pedidos cujo estado seja igual ou maior ao estado passado como argumento
    adicionarWhereGreaterThanOrEqualTo(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento),
            EstadoDocumentoPedido.SUBMETIDO.getId());

    builder.not(builder.exists(criarSubqueryExisteDocumentoCriado(builder, query, fromUltimaVersaoPedido)));

    subqueryUltimaVersaoSubmetida.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersaoSubmetida;
}

private Subquery<Integer> criarSubqueryExisteDocumentoCriado(CriteriaBuilder builder, CriteriaQuery<Pedido> query, Root<Pedido> fromPedido) {
    // select 1 from rap_pedido b where b.rap_cod_tip_doc = a.rap_cod_tip_doc and b.rap_num_doc = a.rap_num_doc and b.rap_ver_doc > a.rap_ver_doc
    // and b.edo_cod_est_doc > 0
    final Subquery<Integer> subqueryUltimaVersao = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersao.from(Pedido.class);

    subqueryUltimaVersao.select(builder.literal(1));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento), 0);

    subqueryUltimaVersao.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersao;
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna1, Expression<?> coluna2) {
    where.add(builder.equal(coluna1, coluna2));
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna, Object parametro) {
    where.add(builder.equal(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThanOrEqualTo(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThan(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}
//开始新代码
子查询子查询SUBQUERYULTIMAVASAODocumentOSUBMETIDOSEMOUTROCRIADO=CRIARSSUBQUERYULTIMAVASAODocumentOSUBMETIDOSEMOUTROCRIADO(生成器,
查询,fromPedido);
Case booleanCase=builder。selectCase();
谓词VersaiGual=builder.equal(fromPedido.get(Pedido.id).get(PedidoPK.versaoDocumento),
亚Querylutimaversaodocumentosubmetidosemoutrocriado);
表达式issubstituicapermitida=booleanCase.when(VersaiGual,true)。否则(false);
//结束新代码
query.select(builder.construct(Pedido.class)、fromPedido.get(Pedido.id)、fromPedido.get(Pedido.estadocumento),
fromPedido.get(Pedido.tipocandiatura)、fromPedido.get(Pedido.numeroProcesso)、fromPedido.get(Pedido.utilizadorGestor),
fromPedido.get(Pedido_u.nomeGestor)、fromPedido.get(Pedido_u.nifappeniciario)、fromPedido.get(Pedido_u.nomeTitular),
fromPedido.get(Pedido_u.utilizadorCriacao)、fromPedido.get(Pedido_u.unidadeOrganicaBeneficiario)、fromPedido.get(Pedido_u.tipoPedido),
JoinesTapEdo、JoineProcEdito、joinTipoDecisao,来源于Pedido.get(Pedido_.utilizadoproprietario),发布实体操作权限);
调用的子查询方法如下所示:

private Subquery<Integer> criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(final CriteriaBuilder builder,
        final CriteriaQuery<Pedido> query, final Root<Pedido> fromPedido) {
    // Select max(a.rap_ver_doc) From rap_pedido a Where a.rap_num_doc = pedido0_.rap_num_doc and a.rap_cod_tip_doc = pedido0_.rap_cod_tip_doc and
    // a.edo_cod_est_doc > 3 and not exists ...
    final Subquery<Integer> subqueryUltimaVersaoSubmetida = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersaoSubmetida.from(Pedido.class);

    subqueryUltimaVersaoSubmetida.select(builder.max(fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento)));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    // Considera todos os pedidos cujo estado seja igual ou maior ao estado passado como argumento
    adicionarWhereGreaterThanOrEqualTo(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento),
            EstadoDocumentoPedido.SUBMETIDO.getId());

    builder.not(builder.exists(criarSubqueryExisteDocumentoCriado(builder, query, fromUltimaVersaoPedido)));

    subqueryUltimaVersaoSubmetida.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersaoSubmetida;
}

private Subquery<Integer> criarSubqueryExisteDocumentoCriado(CriteriaBuilder builder, CriteriaQuery<Pedido> query, Root<Pedido> fromPedido) {
    // select 1 from rap_pedido b where b.rap_cod_tip_doc = a.rap_cod_tip_doc and b.rap_num_doc = a.rap_num_doc and b.rap_ver_doc > a.rap_ver_doc
    // and b.edo_cod_est_doc > 0
    final Subquery<Integer> subqueryUltimaVersao = query.subquery(Integer.class);

    final Root<Pedido> fromUltimaVersaoPedido = subqueryUltimaVersao.from(Pedido.class);

    subqueryUltimaVersao.select(builder.literal(1));

    final List<Predicate> where = new ArrayList<>();

    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.tipoDocumento));
    adicionarWhereEquals(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.numeroDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento),
            fromPedido.get(Pedido_.id).get(PedidoPK_.versaoDocumento));

    adicionarWhereGreaterThan(builder, where, fromUltimaVersaoPedido.get(Pedido_.estadoDocumento), 0);

    subqueryUltimaVersao.where(where.toArray(new Predicate[0]));
    return subqueryUltimaVersao;
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna1, Expression<?> coluna2) {
    where.add(builder.equal(coluna1, coluna2));
}

protected void adicionarWhereEquals(CriteriaBuilder builder, List<Predicate> where, Expression<?> coluna, Object parametro) {
    where.add(builder.equal(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected void adicionarWhereGreaterThanOrEqualTo(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThanOrEqualTo(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna1, Expression coluna2) {
    where.add(builder.greaterThan(coluna1, coluna2));
}

@SuppressWarnings("unchecked")
protected void adicionarWhereGreaterThan(CriteriaBuilder builder, List<Predicate> where, Expression coluna, Comparable parametro) {
    where.add(builder.greaterThanOrEqualTo(coluna, parametro));
}
专用子查询criarSubqueryUltimaVersaoDocumentoSubmetidoSemOutroCriado(最终标准生成器,
最终标准查询,最终根(来自PEDIDO){
//从rap\U pedido a中选择max(a.rap\u ver\u doc),其中a.rap\u num\u doc=pedido0\u.rap\u num\u doc和a.rap\u cod\u tip\u doc=pedido0\u.rap\u cod\u tip\u doc和
//a.edo_cod_est_doc>3且不存在。。。
final Subquery subqueryltimasoasubmetida=query.Subquery(Integer.class);
最终根fromUltimaVersaoPedido=子查询yultimaversaosubmitida.from(Pedido.class);
子查询yultimaversaosubmitida.select(builder.max(来自ultimaversaopedido.get(Pedido.id.get(PedidoPK.versaoDocumento));
最终列表,其中=new ArrayList();
adicionarWhereEquals(builder,where,from ultimaversaopedido.get(Pedido.id).get(PedidoPK.tipoDocumento),
fromPedido.get(Pedido.id).get(PedidoPK.tipoDocumento));
adicionarWhereEquals(builder,where,from multimaversaopedido.get(Pedido.id).get(PedidoPK.numeroDocumento),
fromPedido.get(Pedido.id).get(PedidoPK.numeroDocumento));
//这是一个值得深思的问题,因为它是一个值得讨论的问题
ADICIONAR比OREQUALTO(建筑商,where,来自UltimaverSaoPedido.get(Pedido_u.estadoDocumento))更高,
estadocumentopedido.submitido.getId());
builder.not(builder.exists(criarsubqueryexistedocumentocuriado(builder,query,fromUltimaVersaoPedido));
subquerylultimaversaosubmitida.where(where.toArray(新谓词[0]);
返回subquerylutimaversaosubmetida;
}
私有子查询criarSubqueryExisteDocumentoCriado(CriteriaBuilder生成器,CriteriaQuery查询,根来自Pedido){
//从rap_pedido b中选择1,其中b.rap_cod_tip_doc=a.rap_cod_tip_doc,b.rap_num_doc=a.rap_num_doc和b.rap_ver_doc>a.rap_ver_doc
//b.edo_cod_est_doc>0
final Subquery subqueryltimaversao=query.Subquery(Integer.class);
最终根fromUltimaVersaoPedido=子查询yultimaversao.from(Pedido.class);
选择(builder.literal(1));
最终列表,其中=new ArrayList();
adicionarWhereEquals(builder,where,from ultimaversaopedido.get(Pedido.id).get(PedidoPK.tipoDocumento),
fromPedido.get(Pedido.id).get(PedidoPK.tipoDocumento));
adicionarWhereEquals(builder,where,from multimaversaopedido.get(Pedido.id).get(PedidoPK.numeroDocumento),
fromPedido.get(Pedido.id).get(PedidoPK.numeroDocumento));
AdicionarWheregreater(builder,where,from ultimaversaopedido.get(Pedido.id).get(PedidoPK.versaoDocumento),
fromPedido.get(Pedido.id).get(PedidoPK.versaoDocumento));
adicionarwhere大于(builder,where,from ultimaversaopedido.get(Pedido_u.estadocumento),0);
子查询:where(where.toArray(新谓词[0]);
返回子查询;
}
受保护的void adicionarhereequals(CriteriaBuilder生成器、列表位置、表达式coluna1、表达式coluna2){
其中.add(builder.equal(coluna1,coluna2));
}
受保护的void adicionarhereequals(CriteriaBuilder生成器、列表位置、表达式coluna、对象参数){
其中.add(builder.equal(coluna,parametro));
}
@SuppressWarnings({“rawtypes”,“unchecked”})
受保护的void adicionarwhere大于或等于(CriteriaBuilder生成器,列表位置,表达式coluna,可比参数){
其中.add(builder.greaterThanOrEqualTo(coluna,parametro));
}
@SuppressWarnings({“rawtypes”,“unchecked”})
受保护的void adicionarwhere大于或等于(CriteriaBuilder生成器,列表位置,表达式coluna1,表达式coluna2){
其中添加(builder.greaterThanOrEqualTo(coluna1,coluna2));
}
@抑制警告(“未选中”)
受保护的void adicionarheregreatethan(CriteriaBuilder生成器,列表位置,表达式coluna1,表达式coluna2){
其中.add(builder.greaterThan(coluna1,coluna2));
}
@抑制警告(“未选中”)
受保护的void adicionarWhereGreaterThan(CriteriaBuilder生成器、列表位置、表达式coluna、可比参数){
其中.add(builder.greaterThanOrEqualTo(coluna,parametro));
}
但是,调用查询时出现以下异常。任何类型的