错误:运算符不存在:字符变化= bytea

时间:2012-05-11 06:17:23

标签: hibernate postgresql

我在postgres中有一个表格,结构如下

CREATE TABLE rpaul."HK_LOGIN_DETAILS"
(
  "HK_LOGIN_DETAILS_ID" bigint NOT NULL,
  "HK_LOGIN_DETAILS_USERNAME" character varying(10) NOT NULL,
  "HK_LOGIN_DETAILS_PASSWORD" character varying(50) NOT NULL,
  CONSTRAINT "HK_LOGIN_DETAILS_PK" PRIMARY KEY ("HK_LOGIN_DETAILS_ID" ),
  CONSTRAINT "HK_LOGIN_DETAILS_UK" UNIQUE ("HK_LOGIN_DETAILS_USERNAME" )
)

此表的hibernate映射如下所述

<hibernate-mapping package="net.rpaul.projects.homekeeping.domain.login">
    <class name="LoginDetails" table="`HK_LOGIN_DETAILS`">
        <id name="id" column="`HK_LOGIN_DETAILS_ID`" type="long">
            <generator class="assigned" />
        </id>
        <property name="userName" type="string" column="`HK_LOGIN_DETAILS_USERNAME`" not-null="true" />
        <property name="password" type="string" column="`HK_LOGIN_DETAILS_PASSWORD`" not-null="true" />
    </class>
</hibernate-mapping>

在LoginDetails.java中,我将id字段声明为long,将userName和password字段声明为String。还是当我尝试执行以下

List list =  getHibernateTemplate().find("from LoginDetails ld where ld.userName = ?", userName);

我得到了

  

错误:运算符不存在:字符变化= bytea

我没有得到出错的地方。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:12)

我认为您应该检查您的变量“userName”是否为空。我在这种情况下经历过这样的信息。

答案 1 :(得分:2)

似乎Hibernate由于某种原因将type-parameter发送为bytea(或者更确切地说,可能是java.sql.Types.BLOB),而不是让它让服务器推断或将其设置为text(java.sql) .Types.STRING)。 以下是解决方案JPA lower() function on parameter

的类似问题

答案 2 :(得分:1)

对于原生查询,我们可以使用

SELECT * FROM table 
WHERE 
          (:paramName is null OR column1 = cast(:paramName AS text)) 

然后

query.setParamter(paramName,value);

答案 3 :(得分:0)

这个问题很旧,但是如果有人需要的话,仍然可以分享我在Spring Boot中使用的解决方案。

您可以使用以下WHERE条件来处理NULL值或在Postgres查询中使参数成为可选参数。

SELECT * FROM table 
WHERE 
          (?1 is null OR column1 = cast(?1 AS text)) 
          AND 
          (?2 is null OR column2 = cast(?2 AS text))

如果column1和column2作为NULL传递,则整个WHERE条件为TRUE。 如果不为NULL,则将在查询中考虑column1和column2。

?1为null或column1 =?1::将检查传递的值是否为null,然后整个条件为true(如果为null,则不检查第二个条件[column1 = null]- PG优化)

cast(?1 AS文本):如果出于某些原因将值作为字节传递,则可能很有用。如果传递的值是真正的空值,则如果不进行强制转换,则仍然会出现“字符改变字节数”错误。