当bean具有带@Formula注释的属性时,findRowCount不起作用

时间:2012-09-14 09:02:08

标签: java database orm playframework-2.0 ebean

我有以下课程:

@Entity
@Table(name = "clients")
public class Client extends Model {
    @Id
    public int id;

    @Formula(select = "inv.some_data", 
            join = "left join (select 1 as some_data) as inv")
    public int someData;

    public static Finder<String, Client> find = 
        new Finder<String, Client>(String.class, Client.class);

    public static int countClientsWithData() {
        return Client.find.where().gt("someData", 0).findRowCount();
    }
}

它有someData字段(播放框架会自动生成getter和setter)。此外,countClientsWithDatawhere子句中使用此字段。现在,如果我做

int count = Client.countClientsWithData();

尝试执行查询时会抛出NullPointerException

select count(*) from clients t0 where inv.some_data > ?

看起来findRowCount无法识别@Formula注释中的加入。关于如何解决这个问题的任何想法?

更新了问题:将问题缩小到findRowCount来电。

3 个答案:

答案 0 :(得分:2)

所以你想要计数而不使用 findRowCount()方法并且不需要获取所有数据..

解决方案:复制相同的查询,并在表单select count(*) from ..上创建并使用它查找计数

示例

如果您的查询在表单上..

查询SELECT * FROM clients

然后这行代码Client.find.where().gt("some_data", 0).findRowCount();将等同于......

统计查询SELECT COUNT(*) FROM clients WHERE some_data > 0

答案 1 :(得分:0)

一种可能的方法是使用 findlist() 方法并使用其 size() 方法获取行数而不是 findRowCount() 方法

  

返回Client.find.where()。gt(“totalOrdersAmount”,0).findList()。size();

答案 2 :(得分:0)

你应该调试一下,看看你错过了什么。它或者是描述的错误,或者你在某种程度上完全没有引用你的想法。我们都去过那里,但如果你能在那条线上断点并看到你的物体,那就确保一切都符合你的预期。一旦你试图处理数据库字段并引用它们,例如拼写错误就会引起很多麻烦。