如何在hibernate和postgresql中读出名称中带有冒号(:)的列

Posted

技术标签:

【中文标题】如何在hibernate和postgresql中读出名称中带有冒号(:)的列【英文标题】:How to read out a column with a colon (:) in its name in hibernate and postgresql 【发布时间】:2013-05-16 21:29:17 【问题描述】:

抱歉,这可能是一个非常简单的问题,我搜索并没有找到任何关于我的具体案例的信息。

我有一个 postgre 数据库,其中有一个表,其中有一列名为:

地址:城市

由于我不能在 java 类变量中使用冒号,所以我尝试用这种方式表示它:

@Column(name = "addr:city")
private String addrCity;

遗憾的是这不起作用,我收到以下异常(我很抱歉异常文本中的德语,我不知道为什么会这样 - 翻译它意味着:(冒号)):

错误:FEHLER:Syntaxfehler bei »:« 位置:52 线程中的异常 “主要” org.hibernate.exception.SQLGrammarException:FEHLER: Syntaxfehler bei »:« 位置:52 at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 在 $Proxy12.executeQuery(未知来源) org.hibernate.loader.Loader.getResultSet(Loader.java:1978) 在 org.hibernate.loader.Loader.doQuery(Loader.java:829) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) 在 org.hibernate.loader.Loader.doList(Loader.java:2463) 在 org.hibernate.loader.Loader.doList(Loader.java:2449) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279) 在 org.hibernate.loader.Loader.list(Loader.java:2274) 在 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 在 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1115) 在 org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 在 database.BerlinPolygonDAO.getBerlinLocationByID(BerlinPolygonDAO.java:52) 在 databaseAccess.Tester.main(Tester.java:33) 引起: org.postgresql.util.PSQLException: FEHLER: Syntaxfehler bei »:« 位置:52在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) ... 16 更多

我在其他一些帖子中读到我应该按照下面的方式转义它,但它对我不起作用(例外只是说“\”存在语法错误)

@Column(name = "addr\\:city")
private String addrCity;

使用两个冒号也无济于事:

@Column(name = "addr::city")
private String addrCity;

然后我得到一个例外,即“addr”列(因此没有冒号和其余部分)不存在。

谁能告诉我阅读本专栏需要做什么?非常感谢您与我分享的每一个想法和想法。

编辑:我发现this 相关问题涉及我现在正在处理的完全相同的列和冒号问题,但在休眠状态下不是。我在想这是否会有所帮助。

【问题讨论】:

你试过只用一个反斜杠吗? 一个反斜杠给我一个编译器错误“无效的转义序列(有效的是 \b \t \n \f \r \" \' \\ )”。感谢您的评论。 我将name 参数构建为字符串,并在注释中引用该字符串。如果这不起作用,我会尝试将冒号引用为char,首先使用单引号,然后引用char colon = ':'; 字段。 (显然,我只是在猜测,但我在接下来的几周内有 Hibernate 的东西值得期待,而且我从未使用过它......:\) 感谢您的评论!我试过这个,但遗憾的是它给了我一个“org.postgresql.util.PSQLException: FEHLER: Syntaxfehler bei »\«”异常(“Error: Syntaxerror at »\«”),与我尝试使用两个反斜杠时相同. 嗯。好吧,我无法使用 Hibernate 进行测试,但是其他注释 do 接受字符串中的冒号(@RequestMapping(value="test:test") 工作正常),并且 here 没有迹象表明 @Column 注释的行为特别不同,所以我敢打赌它是 Hibernate 的 SQL 翻译 (HSQL)。不过,我刚刚检查了您的编辑,我想知道您是否尝试过@Column(name="'addr:city'"),它是否可行。 (另外,我会留下你——我的猜测可能没有帮助。) 【参考方案1】:

我解决了我的问题。

如果 postgresql 中的列名中有冒号,并且您尝试使用 hibernate 读取它,则需要像这样声明它:

@Column(name = "\"addr:city\"")
private String addrCity;

【讨论】:

我很高兴能成为你的缪斯女神。 :)

以上是关于如何在hibernate和postgresql中读出名称中带有冒号(:)的列的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate,PostgreSQL:如何在数组列中搜索

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

将 PostgreSQL 9.2.1 与 Hibernate 连接起来

如何使用 JPQL、Spring Data Repositories 和 Hibernate 为 TimescaleDB `time_bucket` 函数参数化 Postgresql 间隔

Hibernate 不使用 Spring boot 在 PostgreSql 中创建数据库

如何通过 Hibernate 创建数据库