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

Posted

技术标签:

【中文标题】当 bean 具有带有 @Formula 注释的属性时,findRowCount 不起作用【英文标题】:findRowCount doesn't work when bean has property with @Formula annotation 【发布时间】:2012-09-14 09:02:07 【问题描述】:

我有以下课程:

@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 字段(play 框架会自动生成getter 和setter)。而且countClientsWithDatawhere 子句中使用了这个字段。现在如果我这样做了

int count = Client.countClientsWithData();

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

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

看起来 findRowCount 无法识别 @Formula 注释中的连接。有关如何解决此问题的任何想法?

更新问题:将问题缩小到findRowCount 通话。

【问题讨论】:

这是一个错误。暂时使用 zaffargachal 所说的话。 不是你的问题的答案,只是我的看法,但如果你真的想使用 SQL,那么你应该使用 iBatis/MyBatis。如果你想使用 JPA,那么使用 JPA 并避免 SQL,避免 SQL,避免 SQL。 【参考方案1】:

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

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

示例

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

查询SELECT * FROM clients

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

计数查询SELECT COUNT(*) FROM clients WHERE some_data &gt; 0

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是否意味着它将从数据库中获取整个表? 是的,它将加载 Java 堆中的所有内容:-( 否,应用聚合函数后会按行分组【参考方案3】:

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

【讨论】:

是的,其他一切都按预期工作,因为 zaffargachal 的答案有效(除了它获取整个表格)

以上是关于当 bean 具有带有 @Formula 注释的属性时,findRowCount 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 @Cacheable 注释的 Spring bean 作为键

带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件不解析 @Value 注释

Spring 注解注入—@Qualifier 注释

任何方式使用@Formula或@CustomTransformer注释中的方言中定义的自定义函数

当 @Repository 注释 bean 的代理时,JdkDynamicAopProxy 需要超过 1 分钟才能启动调用方法

当 bean 类与一对多注释链接时,使用 hibernate 在 db 上选择查询: