13

我有以下课程:

@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)。并且还在子句countClientsWithData中使用此字段。where现在如果我这样做

int count = Client.countClientsWithData();

NullPointerException它会在尝试执行查询时抛出

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

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

更新的问题:缩小问题findRowCount范围。

4

3 回答 3

2

因此,您希望在不使用findRowCount()方法且不获取所有数据的情况下进行计数..

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

示例

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

查询SELECT * FROM clients

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

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

于 2013-05-26T09:15:27.610 回答
0

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

return Client.find.where().gt("totalOrdersAmount", 0).findList().size();

于 2012-09-24T12:29:09.127 回答
0

你应该调试它,看看你缺少什么。这要么是所描述的错误,要么您根本没有引用您认为的内容。虽然我们都去过那里,但是如果您可以在该行断点并查看您的对象,只需确保一切都是您期望的样子。一旦您添加尝试处理数据库字段并引用它们,例如拼写错误就会引起很多麻烦。

于 2012-10-17T16:55:24.247 回答