Java 使用@Formular计算实体属性

Java 使用@Formular计算实体属性,java,spring-boot,hibernate,Java,Spring Boot,Hibernate,我有一个经典的spring boot、hibernate和postgres应用程序 我有一个名为saveMetadata的嵌入式实体,我想在其中添加一个名为instanceCount的字段 预期行为 从数据库加载实体时,我希望将属性instanceCount设置为deleteTimestamp==null的实体数 实际行为: 我得到一个InvalidDataAccessResourceUsageException "InvalidDataAccessResourceUsageExcep

我有一个经典的spring boot、hibernate和postgres应用程序

我有一个名为saveMetadata的嵌入式实体,我想在其中添加一个名为instanceCount的字段

预期行为

从数据库加载实体时,我希望将属性
instanceCount
设置为
deleteTimestamp==null
的实体数

实际行为:

我得到一个InvalidDataAccessResourceUsageException

"InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet;\ncaused by SQLGrammarException: could not extract ResultSet;\ncaused by PSQLException: ERROR: syntax error at or near \"as\"\n  Position: 1214;\ncaused by PSQLException: ERROR: syntax error at or near \"as\"\n  Position: 1214"

=
是java,而不是sql语法。最好使用
为null,尽管
==
是java,而不是sql语法。最好使用
为null
,尽管@Formula注释中的SQL查询语法错误。您也缺少结束括号。我认为应该如下所示:

@Formula("(SELECT COUNT(*) FROM SaveMetadata WHERE deletedTimestamp is NULL)")
private Long instanceCount;

话题:我会考虑改变方法。您真的需要在每个实体实例中存储值吗?

您的SQL查询在@Formula注释中的语法是错误的。您也缺少结束括号。我认为应该如下所示:

@Formula("(SELECT COUNT(*) FROM SaveMetadata WHERE deletedTimestamp is NULL)")
private Long instanceCount;

话题:我会考虑改变方法。您真的需要在每个实体实例中存储值吗?

谢谢您的帮助!我会考虑如果我能改变这种方法,但现在我想我需要对业务逻辑的价值。那么,当您需要业务逻辑中的值时,调用在公式中放置的查询如何?这将导致占用的内存减少。感谢您的帮助!我会考虑如果我能改变这种方法,但现在我想我需要对业务逻辑的价值。那么,当您需要业务逻辑中的值时,调用在公式中放置的查询如何?这将导致占用的内存减少。@Martin该更改是否也解决了您的问题?@marcin.programuje该更改部分解决了问题,但我的查询仍然中断。@Martin该更改是否也解决了您的问题?@marcin.programuje该更改部分解决了问题,但我的查询仍然中断。