在这种情况下,是否有可能让 hibernate 为某些“正确”的价值做“正确的事情”?
from ClassA a, ClassB b
where a.prop = b.prop
问题是 prop 是一个在连接表中具有不同表示形式的 UserType。在表 A 中,它表示为整数,在表 B 中,它表示为 char。因此 eq 测试转换为查看 1 == 'a' 或多或少,这是错误的,但由 1 或 'a' 表示的对象应该是相同的,因此它们应该比较为真。
我认为您可以使用<formula>
映射文件中关系上的标签来执行此操作。
例如:
<many-to-one name="myClassB" class="ClassB">
<formula>--Some SQL Expression that converts between ClassA.prop and ClassB.prop</formula>
</many-to-one>
我用它来关联两个表,其中一个使用整数,但将其关联到另一个表中的 char 字段。这可能不是您正在寻找的东西,但也许它会让您走上正确的轨道。
使用 SQL 表达式进行连接。这样您就可以在查询本身中显式地进行类型转换。
(1) 将映射到“prop”的列的数据类型更改为相同。这将需要“让 DBA 成为你的朋友”,但会导致一致的“道具”用户类型使用。
(2)处理equals()方法中的类型差异
public boolean equals(Object x, Object y) throws HibernateException {
boolean retValue = false;
if (x == y) retValue = true;
if (x!=null && y!=null){
Character xChar = new Character(x);
Character yChar = new Character(y);
if (xChar.equals(ychar)){
retValue = true;
}
}
return retValue;
}