NVL2 эквивалент в критериях

У меня есть SQL-запрос, как показано ниже

select name, loc, status, proj, nbr, sum(sub) as sub, nvl2(val, ''Y'', ''N'') where name = "value" group by name, loc, status, proj, nbr, nvl2(val, ''Y'', ''N'')

Я пытался написать то же самое, используя критерии

ProjectionList proList = Projections.projectionList();
proList.add(Projections.sum("sub"));
criteria.add(Restrictions.like("name", StringUtils.appendWildCard("value")).ignoreCase());              
criteria.addOrder(Order.asc("value"));      

Я хочу знать, как написать coalesce для nvl, а также, если порядок строк правильный. Какие-либо ведет?

1 ответ

С использованием Projections.sqlGroupProjection(...) наряду с критериями, как показано ниже

    List<CoalesceDemo> list = session.createCriteria(CoalesceDemo.class).
        setProjection(Projections.projectionList()
                .add(Projections.sum("sub"))
                .add(Projections.sqlGroupProjection("nvl2(val, 'Y', 'N') as decodedVal", "nvl2(val, 'Y', 'N')", 
new String [] {"decodedVal"}, new Type[]{BooleanType.INSTANCE}))
                .add(Projections.groupProperty("name"))
                .add(Projections.groupProperty("val"))
                .add(Projections.groupProperty("nbr"))
                .add(Projections.groupProperty("proj"))
                .add(Projections.groupProperty("loc")))
        .add(Restrictions.eq("name", "value")).list();

привел к следующему запросу, который вы ищете:

select this_.name as y0_, this_.loc as y1_, this_.nbr as y2_, this_.proj as y3_, sum(this_.sub) as y4_, 
nvl2(val, 'Y', 'N') as decodedVal, this_.name as y6_, this_.val as y7_, this_.nbr as y8_, 
this_.proj as y9_, this_.loc as y10_ from CoalesceTable this_ where this_.name=? 
group by nvl2(val, 'Y', 'N'), this_.name, this_.val, this_.nbr, this_.proj, this_.loc

Другой способ заключается в использовании @Formula аннотация на новом поле в вашей сущности.

В моем случае я добавил это поле в CoalesceDemo учебный класс

@Formula("nvl2(val, 'Y', 'N')")
public String decodedVal;

И используйте это в запросе Criteria, как показано ниже:

List<CoalesceDemo> list = session.createCriteria(CoalesceDemo.class).
    setProjection(Projections.projectionList()
            .add(Projections.sum("sub"))
            .add(Projections.groupProperty("name"))
            .add(Projections.groupProperty("val"))
            .add(Projections.groupProperty("nbr"))
            .add(Projections.groupProperty("proj"))
            .add(Projections.groupProperty("decodedVal"))
            .add(Projections.groupProperty("loc")))
    .add(Restrictions.eq("name", "value")).list();

И это приводит к запросу, как показано ниже:

select this_.name as y0_, this_.loc as y1_, this_.nbr as y2_, this_.proj as y3_, sum(this_.sub) as y4_, 
this_.name as y5_, this_.val as y6_, this_.nbr as y7_, this_.proj as y8_, 
nvl2(this_.val, 'Y', 'N') as y9_, this_.loc as y10_ from CoalesceTable this_ where this_.name=? 
group by this_.name, this_.val, this_.nbr, this_.proj, nvl2(this_.val, 'Y', 'N'), this_.loc

Посмотрите, поможет ли это, и вы можете проверить это с вашими данными.

Другие вопросы по тегам