使用条件生成器生成string_agg

时间:2019-03-18 10:02:47

标签: java postgresql jpa

我试图在条件构建器中创建一个函数,但是执行该命令后,我得到了以下提示。

.setMaximumCategoryLabelWidthRatio(float ratio)

}

例外:

CriteriaBuilder builder = manager.getCriteriaBuilder();

    CriteriaQuery<RetrospectiveSearchVO> criteriaQuery = builder.createQuery(RetrospectiveSearchVO.class);
    Root<Authorization> root = criteriaQuery.from(Authorization.class);
    Join<Authorization, MedicalDiagProcedure> medicalDiagProcedureJoin = root.join(Authorization_.medicalDiagProcedures,JoinType.LEFT);
    Join<MedicalDiagProcedure, MedicalDiagnosis> medicalDiagJoin = medicalDiagProcedureJoin.join(MedicalDiagProcedure_.medicalDiagnosis,JoinType.LEFT);
    Join<MedicalDiagnosis, ReferenceData> medicalDiagRefDataJoin = medicalDiagJoin.join(MedicalDiagnosis_.diagnosis,JoinType.LEFT);

    ArrayList<Predicate> conditions = new ArrayList<>();
    conditions.add(builder.like(medicalDiagRefDataJoin.get(ReferenceData_.referenceTypeValue), dignosisValue));

    Expression<String> functionStringAgg = builder.function( "string_agg", String.class,
            medicalDiagRefDataJoin.<String>get("referenceTypeValue"),
            builder.parameter(String.class, "delimiter"));

    Expression<String> parentExpression = root.get(Authorization_.authorizationNbr);
    Predicate parentPredicate = parentExpression.in(claimNbr);
    conditions.add(builder.equal(medicalDiagJoin.get(MedicalDiagnosis_.diagType),"F"));
    criteriaQuery.where(parentPredicate,builder.and(conditions.toArray(new Predicate[] {})));
    criteriaQuery.multiselect(
            root.get(Authorization_.authorizationNbr), functionStringAgg);
    criteriaQuery.groupBy(root.get(Authorization_.authorizationNbr));
    Query query = manager.createQuery(criteriaQuery);
    /*Query query = manager.createNativeQuery("select  authorizat0_.authorization_nbr as dignosisnbr, STRING_AGG(referenced3_.reference_value,',') as finaldiagnosis from  claims.authorization authorizat0_ left outer join claims.medical_diag_procedure medicaldia1_ on " + 
            " authorizat0_.authorization_id=medicaldia1_.authorization_id left outer join claims.medical_diagnosis medicaldia2_ on " + 
            " medicaldia1_.medical_code_id=medicaldia2_.medical_code_id left outer join ref_data.reference_data_master referenced3_ on  " + 
            " medicaldia2_.diagnosis_id=referenced3_.reference_data_id where authorizat0_.authorization_nbr in :authorizationNbr and medicaldia2_.diag_type='F' and referenced3_.reference_value like group by  authorizat0_.authorization_nbr");
    query.setParameter("authorizationNbr", claimNbr);   
    query.unwrap(SQLQuery.class)
            .setResultTransformer( Transformers.aliasToBean( RetrospectiveSearchVO.class ));*/
    List<RetrospectiveSearchVO> retrospectiveSearchList = query.getResultList();
    return retrospectiveSearchList;


public class PGDialect extends PostgreSQL82Dialect {

public PGDialect() {
    super();
    registerFunction("string_agg", new SQLFunctionTemplate(StandardBasicTypes.STRING, "string_agg(?1, ', ')"));
}

1 个答案:

答案 0 :(得分:1)

对于字符串定界符作为函数的参数,请使用literal function

criteriaBuilder.literal(",")