【问题标题】:Hibernate - How to add property to projection list , if another property value is null?Hibernate - 如果另一个属性值为空,如何将属性添加到投影列表?
【发布时间】:2015-12-15 12:14:17
【问题描述】:

如果有限制/预测条件。

我正在以这种方式使用 pojo(for table 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]

没关系。但我想要的是,我想连接徽章和颜色并显示它。

这就是我在上面显示的 pojo 中添加@Formula 的原因。

然后,我以这种方式将徽章颜色列添加到投影列表中,

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.

请帮忙..

【问题讨论】:

    标签: hibernate formula criteria projection notnull


    【解决方案1】:

    您必须通过将空字符串包装在 COALESCE 中来将 NULL 值转换为空字符串。

    将公式代码更改为:

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

    【讨论】:

    • 是否有计算表格中所有行数的公式?
    • @Riasat 是的。您应该在计算表行数的公式值中放置查询。喜欢这个@Formula("(select count(*) from ...")
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 2022-06-29
    • 1970-01-01
    • 2017-09-22
    • 2015-04-01
    • 2017-04-10
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多