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
Посмотрите, поможет ли это, и вы можете проверить это с вашими данными.