如何将包含'的字符串保存到PostgreSQL中
Posted
技术标签:
【中文标题】如何将包含\'的字符串保存到PostgreSQL中【英文标题】:How to save a string that contain ' into PostgreSQL如何将包含'的字符串保存到PostgreSQL中 【发布时间】:2015-06-12 15:36:42 【问题描述】:我在使用 Java 的应用程序中使用 PostgreSQL 作为数据库。当我尝试将字符串插入text
类型的字段时,如果字符串包含'
,则会引发异常。我得到的例外是:
Hibernate: update public.slider_group set slid_grou_title=?, slid_grou_short_desc=?, site_id=?, status=?, update_date=?, no_slide=?, pos_type=?, widget_type=?, custom_html=? where slid_grou_id=?
20:47:12.476 [http-nio-8080-exec-7] ERROR o.h.util.JDBCExceptionReporter - Batch entry 0 update public.slider_group set slid_grou_title= was aborted. Call getNextException() to see the cause.
20:47:12.476 [http-nio-8080-exec-7] ERROR o.h.util.JDBCExceptionReporter - ERROR: syntax error at or near "\"
20:47:12.522 [http-nio-8080-exec-7] ERROR o.h.e.d.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:180) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) ~[hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) [hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206) [hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375) [hibernate-core-3.5.1-Final.jar:3.5.1-Final]
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) [hibernate-core-3.5.1-Final.jar:3.5.1-Final]
我没有在此处添加完整的异常消息。
有什么办法可以将字符串保存到数据库中,即使它包含'
这是休眠查询,对象“widgetContentTo”的字段包含要保存到数据库中相应字段中的字符串
public void saveOrUpdateWidgetContent(WidgetContentTo widgetContentTo) throws HibernateException
try
getCurrentSession().saveOrUpdate(widgetContentTo);
catch (Exception ex)
System.out.println(ex);
对应于我要保存到数据库的对象的类:
public class WidgetContentTo
private int widgetContentId;
private int siteId;
private String widgetContentName;
private String widgetContentShortDesc;
private int noWebcontents;
private String status;
private Timestamp timeCreated;
private Timestamp updateDate;
private String posType;
private String widgetType;
private String customHtml;
如果最后一个字段 customHtml 包含单引号,则会出现异常。我尝试如下替换单引号:
String data = widgetContentTo.getCustomHtml();
data = data.replace("'", "\'");
widgetContentTo.setCustomHtml(data);
数据库中表的名称为slider_group
,customHtml
对应的字段为custom_html
,数据类型为text
【问题讨论】:
用\'
转义'
。在保存到数据库之前对所有其他此类字符执行此操作。
hibernate.dialect
设置正确了吗?
@jaycp:您不需要在应用程序代码中这样做——这是 ORM 的工作。
请出示您用于插入记录的代码。
@edwiser,请编辑问题,不要在cmets中发布相关信息。
【参考方案1】:
如果您不依赖任何东西为您转义,您正在寻找的转义字符是:\
例子:
SELECT trequests.reqid,
FROM lngprtl.tbranches
WHERE tbranches.branchid = '\'test\''
上述选择将返回分支ID等于'test'
的结果
【讨论】:
他的问题中有hibernate
标签,为什么你认为他的代码中有一些手写的SQL?
重点是 OP 不应该需要转义任何东西,因为 Hibernate 应该为他们做这一切。
[***.com/questions/30809307/… 是一个类似的实例以上是关于如何将包含'的字符串保存到PostgreSQL中的主要内容,如果未能解决你的问题,请参考以下文章
将 PostgreSQL JSON 列映射到 Hibernate 实体属性
如何将所有包含连字符/破折号(?)的类应用于任何 DOM 元素并将它们保存到 JavaScript 中的数组中?