Hibernate - 如果另一个属性值为null,如何向投影列表添加属性?

时间:2015-09-18 11:04:40

标签: hibernate formula criteria projection notnull

如果条件有限制/预测,怎么办??

我有这样的pojo(对于表学生),

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 = null值的所有行。所以我只是作为输出记录。

[[118,LB22,22] // [SSN,BadgeColor,Color]

有谁可以帮我解决这个问题?

我想要的是,

   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.

请帮助..

1 个答案:

答案 0 :(得分:0)

您必须将空值字符串转换为空值,并将其包装在COALESCE中。

将公式代码更改为:

clock_gettime()