繁体   English   中英

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

[英]Ebean - Find by part of UUID in UUID column Type

由于历史原因,我们将ORM模型称为带有多个UUID值的波纹管。 是的,我知道。我们必须为用户实现新的前端,用户只能写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);
}
  • 对于普通的String或Text值..icontains(..)可以正常工作

根据PostgreSQL文档9.4 字符串函数和运算符 (表9.8),函数lower(string)接受字符串文字和“将[a]字符串转换为小写”的表示形式。

如异常消息所示,

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

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

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

这应该可以解决问题。 请注意最后的toString() ,它将转换为字符串文字。 转换的详细信息在UUID.toString()的JavaDoc中进行了描述。

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

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM