使用UUID作为参数的Hibernate命名查询

3
我正在尝试使用一个针对Postgres数据库的命名查询,选择所有具有给定UUID(用作外键)的行。以下是被调用的命名查询:
  @NamedNativeQuery(name = "getAllXByFK",
  query = "SELECT * FROM table n WHERE FK = :param",
    resultClass = Foobar.class)})

我使用java.util.UUID类型设置参数。

query.setParameter(param.getKey(), param.getValue());

当我使用query.list()获取结果集时,会报错如下:

ERROR: operator does not exist: uuid = bytea

有什么建议吗?


请查看https://dev59.com/v2855IYBdhLWcg3wKxDc 您可以尝试实现类似于HHH-3579补丁的用户类型。 - blagerweij
2个回答

2

虽然不够美观,但这个方法对我很有效:

SQL:

SQLQuery query = session.createSQLQuery("... where cast(c.id as varchar) = :id ");

参数设置如下:

query.setString("id", myUUID.toString());

如果在id列进行转换,我想知道PostgreSQL是否仍然使用索引...?

编辑:

使用Hibernate 5.0.9,我奇怪地不需要使用丑陋的转换,我可以按预期设置参数:

query.setParameter("id", myUUID);

编辑于2019年5月11日:

对于SQL查询,我现在倾向于在我的Hibernate项目中使用jdbcTemplate。只需进行自动装配并使用它:

@Autowired
private NamedParameterJdbcTemplate  jdbcTemplate;

// ...

MapSqlParameterSource p = new MapSqlParameterSource("name", "value");
p.addValue("anotherParam", true);
List<Map<String, Object>> result = jdbcTemplate.queryForList("select ... where id = :name", p);

2
它不使用索引。在解释时,没有类型转换会显示“索引扫描...”,而有类型转换的解释会显示“顺序扫描...”。 - Richeek

1
通常当您为绑定参数提供了null值时,会报告此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接