假设我有一个具有dateOfBirth
和yearOfBirth
属性的Person
类,持久化在Postge数据库中。我需要用条件映射yearOfBirth
:如果设置了dateOfBirth
,则从中提取年份,否则使用yearOfBirth
值。
我试着使用这样的映射:
<property name="dateOfBirth" type="timestamp" >
<column name="date_of_birth" />
</property>
<property name="yearOfBirth" type="integer" formula="(
CASE
WHEN dateofbirth is NULL THEN year_of_birth
ELSE TO_NUMBER(TO_CHAR(dateofbirth, 'YYYY'), 'FM9999')
END
)" generated="always">
<column name="year_of_birth"/>
</property>
但它给了我PSQLException:ERROR: column coreemploy0_.year_of_birth does not exist
。但是year_of_birth
列肯定存在于表中。
除此之外,我还尝试使用简化的映射:
<property name="yearOfBirth" type="integer" formula="(
TO_NUMBER(TO_CHAR(dateofbirth, 'YYYY'), 'FM9999')
)" generated="always">
<column name="year_of_birth"/>
</property>
它给了我正确的输出,但在实体更新后,数据库中的列仍然为空。我认为generated="always"
部分应该使属性可更新。
那么,有人能告诉我们,有没有一种正确的方法可以使该属性同时具有计算性和持久性?
计算属性没有自己的列映射。
已在此处讨论