如何将包含'的字符串保存到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_groupcustomHtml对应的字段为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 实体属性

将 java 对象保存到 PostgreSQL

如何选择包含特定单词的 postgreSQL 行

如何将所有包含连字符/破折号(?)的类应用于任何 DOM 元素并将它们保存到 JavaScript 中的数组中?

如何将 Postgresql 布尔值转换为 MySQL Tinyint?

编写程序,输入字符串(包含空格),统计其中单词的个数,单词之间以一个或多个空格分隔。