我試圖讓我的一個字段可以計算,但我並不真正想要在實體被檢索的時候計算它。我想要的是,僅在當前查詢需要時或僅在調用getter時才計算它。這就是爲什麼我使用@Formula:延遲加載在@Formula在休眠中不起作用
@Basic(fetch = FetchType.LAZY)
@Formula("(SELECT max(myEntity.CREATION_TIME) FROM MyEntity myEntity
WHERE myEntity.account_id = id)")
private LocalDateTime entitiesModifiedDate;
要使其工作,我用的字節碼儀器這樣的:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>Instrument domain classes</id>
<configuration>
<tasks>
<taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
<classpath>
<path refid="maven.dependency.classpath" />
<path refid="maven.plugin.classpath" />
</classpath>
</taskdef>
<instrument verbose="true">
<fileset dir="${project.build.outputDirectory}">
<include name="**/entity/*.class" />
</fileset>
</instrument>
</tasks>
</configuration>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
有跡象表明,我在這裏面臨着兩個問題:
- 似乎即使我從另一個問題得到這個語法,語法也是不正確的。錯誤我:
的螞蟻BuildException發生:儀器不支持「詳細」屬性:類型不支持「詳細」屬性。
- 萬一我除去冗長=「真」,它的工作原理,但是,子查詢是每個查詢,以我的實體(無效果)的一部分。
還有什麼應該做的,使其工作?
這裏我把爲例:http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode-instrumentation.html
更新時間:
查詢例如:
SELECT
...{fields}...,
(
SELECT
MAX(event.creation_time)
FROM
MyEntity myEntity
WHERE
myEntity.accountId = account1_.id
) AS formula0_
FROM
Table1 table10_
CROSS JOIN account_table account1_
WHERE
table10_.account_id = account1_.id
AND
account1_.user_id = 1
你能通過git分享這個項目的一部分嗎? – Sergii