Ebean - 在 UUID 列类型中按部分 UUID 查找
Ebean - Find by part of UUID in UUID column Type
由于历史原因,我们有如下所示的 ORM 模型和几个 UUID 值。是的,我知道.. 我们必须为用户实施新的前端,用户只能在其中写入 UUID 的一部分(打印在盒子、纸张等上)用于手动验证(工厂中的问答)。通常这是通过 QR reader 完成的,但在某些情况下无法扫描它。所以用户可以写前 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(..) 有效
根据 PostgreSQL 文档部分 9.4. String Functions and Operators (Table 9.8),函数 lower(string)
接受字符串文字和 "Converts [a] string to lower case" 表示。
如异常消息所述,
ERROR: function lower(uuid) does not exist.
因此您必须制定标准查询以获取 UUID
值的字符串表示形式,例如:
query.where().icontains("order_b", request. order_b.toString());
这应该可以解决问题。请注意最后的 toString()
,它执行到字符串文字的转换。 UUID.toString()
.
的 JavaDoc 中描述了转换的详细信息
作为参考,我将 link 添加到您在代码片段中应用的 ExpressionList.icontains()
方法的 JavaDoc。在内部,它 "uses a lower()
function to make the expression case insensitive".
希望对您有所帮助。
由于历史原因,我们有如下所示的 ORM 模型和几个 UUID 值。是的,我知道.. 我们必须为用户实施新的前端,用户只能在其中写入 UUID 的一部分(打印在盒子、纸张等上)用于手动验证(工厂中的问答)。通常这是通过 QR reader 完成的,但在某些情况下无法扫描它。所以用户可以写前 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(..) 有效
根据 PostgreSQL 文档部分 9.4. String Functions and Operators (Table 9.8),函数 lower(string)
接受字符串文字和 "Converts [a] string to lower case" 表示。
如异常消息所述,
ERROR: function lower(uuid) does not exist.
因此您必须制定标准查询以获取 UUID
值的字符串表示形式,例如:
query.where().icontains("order_b", request. order_b.toString());
这应该可以解决问题。请注意最后的 toString()
,它执行到字符串文字的转换。 UUID.toString()
.
作为参考,我将 link 添加到您在代码片段中应用的 ExpressionList.icontains()
方法的 JavaDoc。在内部,它 "uses a lower()
function to make the expression case insensitive".
希望对您有所帮助。