我在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
我没有得到出错的地方。任何帮助将不胜感激。
答案 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文本):如果出于某些原因将值作为字节传递,则可能很有用。如果传递的值是真正的空值,则如果不进行强制转换,则仍然会出现“字符改变字节数”错误。