我有一些实体,例如地址。由于性能问题,我想将整个实体保存在单个字段中,例如“street;zip;city”。
可以创建一个EnhancedUserType来做到这一点。在一些示例中,我发现在 hibernate 源中,方法“objectToSQLString”始终是这样实现的:
@Override
public String objectToSQLString(Object object) {
if (object != null) {
Address oo = (Address)object;
return "'" + oo.toSomeString() + "'";
} else {
return "";
}
}
我不明白该方法是否返回 SQL 表示形式。为什么特殊符号(例如 ['])在字符串内没有转义?我该如何逃离他们?标准的 SQL 转义方式是 ['] -> [''],但在某些方言中 [反斜杠] 也必须转义。
是否有一些 Hibernate 实用程序可以根据方言为我进行转义? Hibernate本身是如何解决这个问题的呢?我在源代码中找不到它:-(
最佳答案
您确实必须返回一个 SQL 文字字符串,用单引号括起来,并转义内部范围。 AFAIK,只有单引号必须通过加倍转义:'O''Reilly'
。至少这就是 apache commons-lang StringEscapeUtils 所做的(或所做的)。
但我怀疑将这样的整个地址放在一列中是否会获得任何好处。并且您将无法查询地址的各个字段。您是否测量过这三个字段导致了性能问题,并将它们放在单个列中可以解决问题?
关于java - 编写EnhancedUserType在Hibernate中保存类似字符串的信息,避免SQL注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933300/