Ebean - 在 UUID 列类型中按 UUID 的一部分查找

Posted

技术标签:

【中文标题】Ebean - 在 UUID 列类型中按 UUID 的一部分查找【英文标题】:Ebean - Find by part of UUID in UUID column Type 【发布时间】:2018-06-25 18:15:25 【问题描述】:

由于历史原因,我们有如下的 ORM 模型,其中包含多个 UUID 值。是的,我知道.. 我们必须为用户实施新的前端,用户只能编写 UUID 的一部分(打印在盒子、纸张等上)。它用于手动验证(工厂问答)。通常这是通过 QR 阅读器完成的,但在某些情况下无法扫描它。所以用户可以写前 10 个字符或最后 6 个字符...

!! -> 我们无法更改此模型的任何内容。 (公司……)

public class Model_OrderCross 

   public UUID id;
   public UUID order_a;
   public UUID order_b;
   public UUID order_c;
   public UUID order_e;

我为什么要问。当我们尝试查找具有这部分 UUID 的对象列表时,我们遇到了来自 Ebean 的参数类型错误的异常

Caused by: org.postgresql.util.PSQLException
Cause message: ERROR: function lower(uuid) does not exist
  Rada: No function matches the given name and argument types. You might need to add explicit type casts.

我正在使用 ORM 查询:

Query<Model_OrderCross > query = Ebean.find(Model_OrderCross.class);

// Where order_b is something like "f223274c-51" from Full UUID "f223274c-51ca-4489-a5b2-7d3b29887cfb" 
if (request.order_b != null)        
    query.where().icontains("order_b", request. order_b);


if (request.order_c != null)        
    query.where().icontains("order_c", request. order_c);

对于普通的字符串或文本值 ..icontains(..) 工作

【问题讨论】:

【参考方案1】:

根据 PostgreSQL 文档部分 9.4. String Functions and Operators(表 9.8),函数 lower(string) 接受字符串文字和“将 [a] 字符串转换为小写”表示。

正如异常消息所说,

错误:函数 lower(uuid) 不存在。

因此,您必须制定标准查询以获取 UUID 值的字符串表示形式,例如:

query.where().icontains("order_b", request. order_b.toString());

这应该可以解决问题。请注意末尾的toString(),它将转换为字符串文字。转换的细节在UUID.toString()的JavaDoc中有描述。

作为参考,我将链接添加到您在代码 sn-p 中应用的 ExpressionList.icontains() 方法的 JavaDoc。在内部,它“使用lower() 函数使表达式不区分大小写”。

希望对你有帮助。

【讨论】:

以上是关于Ebean - 在 UUID 列类型中按 UUID 的一部分查找的主要内容,如果未能解决你的问题,请参考以下文章

uuid 创建中按位运算符的替代方案

如何使用 django 自动创建 uuid 列

500:非 uuid 类型而不是 404

如何在 SQLAlchemy 中使用 UUID?

如何使用 GRDB Swift 迁移更改列类型?

BIGQUERY - 查询所有具有唯一 SSN 和 DOB 值的 UUID,基于 UUID 列加入 2 个表