当 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)。而且countClientsWithData
在where
子句中使用了这个字段。现在如果我这样做了
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 > 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 注释
任何方式使用@Formula或@CustomTransformer注释中的方言中定义的自定义函数
当 @Repository 注释 bean 的代理时,JdkDynamicAopProxy 需要超过 1 分钟才能启动调用方法