2015-09-18 1 views
1

Как иметь условие с ограничениями/проекциями.?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. 

пожалуйста, помогите ..

ответ

0

вы должны преобразовать NULL значения с пустой строкой, обернув его в COALESCE.

изменить формулу кода следующим образом:

@Formula(value = "concat(COALESCE(Badge,''), ' ', COALESCE(Color,''))") 
private String BadgeColor; 
+0

Есть ли формула для подсчета всех строк в таблице? – StarDust

+0

@Riasat да есть. вы должны в формуле значение поставить запрос, который подсчет строк таблицы. как для этого '@Formula (" (выберите count (*) from ... ")' –