Как иметь условие с ограничениями/проекциями.?Hibernate - Как добавить свойство в список прогнозов, если другое значение свойства равно null?
Я имею POJO (для таблицы Student) таким образом,
class student
{
@Id
@Column(name = "SSN", unique = true, nullable = false)
private String SSN;
@Column(name = "Badge")
private String Badge;
@Column(name = "Color")
private String Color;
@Formula(value = " concat(Badge, '', Color) ")
private String BadgeColor;
//getters and setters.
}
данных для этих столбцов в студенческой таблице таким образом,
ssn badge color
=== ==== ======
118 LB 22
117 GAAG 33
Я выборки criteria.list() из таблица с помощью выступов таким образом,
// setup projections for column selection
Criteria cr = session.createCriteria(Student.class);
List<String> requestedColumns=[ssn,badge,color];
if (requestedColumns != null && requestedColumns.size() > 0) {
ProjectionList pl = Projections.projectionList();
for (String column : requestedColumns) {
pl.add(Projections.property(column));
}
cr.setProjection(pl);
}
return cr.list();
Таким образом, я получаю выход этот путь,
[[118, LB, 22]//[SSN,BADGE,Color]
[117, GAAG, 33]//[SSN,BADGE,Color]
Это нормально. Но я хочу, хочу, чтобы конкат значок & цвет и показать его.
И вот почему я добавил @Formula в свое pojo выше показано.
И потом, я добавил столбец badgecolor в список проекционной этот путь,
List<String> requestedColumns=null;
if (requestedColumns != null && requestedColumns.size() > 0) {
ProjectionList pl = Projections.projectionList();
for (String column : requestedColumns) {
if(column.equalsIgnoreCase("Badge"))
{
pl.add(Projections.property("BadgeColor"));
}
else
pl.add(Projections.property(column));
}
cr.setProjection(pl);
}
Теперь я получаю данных таким способом,
[[118, LB22, 22]//[SSN,BadgeColor,Color]
**[117, null, 33]//[SSN,BadgeColor,Color]**
Проблема в том, если BadgeColor == NULL, как указано выше тогда мне нужно получить данные бейджа.
т.е. ожидается выход,
[[118, LB22, 22]//[SSN,BadgeColor,Color]
**[117, GAAG, 33]//[SSN,badge,Color]**//
Я попытался, добавив рестрикционных ISNOTNULL
таким образом, добавляя в список проекции,
if(column.equalsIgnoreCase("Badge"))
{
**cr.add(Restrictions.isNotNull("BadgeColor"));**
pl.add(Projections.property("BadgeColor"));
}
else
pl.add(Projections.property(column));
Но она полностью удалить все строки с BadgeColor = нулевые значения из списка. Так что я получаю только запись на выходе.
[[118, LB22, 22] // [ПЛА, BadgeColor, цвет]
Может кто-нибудь помочь мне в этом вопросе?
То, что я хочу,
If this formula calculated BadgeColor column value != null - add BadgeColor property to projection.
else if formula calculated BadgeColor column value == null - then add badge property to projection.
пожалуйста, помогите ..
Есть ли формула для подсчета всех строк в таблице? – StarDust
@Riasat да есть. вы должны в формуле значение поставить запрос, который подсчет строк таблицы. как для этого '@Formula (" (выберите count (*) from ... ")' –