Postgres

@DbArray 的主要目标数据库是 Postgres,作为单维数组。随着时间的推移,我们还可以将其映射到 Oracle 嵌套表,但在此阶段,这将按需完成(您可以询问并赞助开发工作等)。

回退

对于非 Postgres,回退是简单地将数据存储在 VARCHAR 中的 JSON 形式(例如 @DbJson)。

示例:uuid[]

@DbArray
List<UUID> uids = new ArrayList<UUID>();

上面的示例将映射到数据库列类型 uuid[]

示例:integer[]

@DbArray
List<Long> someIds = new ArrayList<Long>();

上面的示例将映射到数据库列类型 integer[]

示例:varchar[]

@DbArray
List<String> phoneNumbers = new ArrayList<String>();

上面的示例将映射到数据库列类型 varchar[]

回退 varchar 长度

length 属性与非 Postgres 数据库一起使用,并定义在回退情况下使用的 varchar 列的大小。

// fallback to varchar(300) for non-Postgres databases
@DbArray(length = 300)
List<String> phNums = new ArrayList<String>();

表达式

Ebean “查询 Bean” 和 ExpressionList 添加了 4 个表达式来处理我们想要执行的常见 ARRAY 表达式。

以下示例使用映射到 varchar 数组的 phNums 属性。

contains()

List<Contact> contacts = Contact.find
    .where()
    .phNums.contains("2314")
    .findList();

contains() 使用 @> contains 运算符,并产生以下谓词

where t0.ph_nums @> array[?]; --bind(2314)

notContains()

List<Contact> contacts = Contact.find
    .where()
    .phNums.notContains("2314")
    .findList();

notContains() 使用 @> contains 运算符,并产生以下谓词

where not (t0.ph_nums @> array[?]); --bind(2314)

isEmpty()

List<Contact> contacts = Contact.find
    .where()
    .phNums.isEmpty()
    .findList();

isEmpty() 使用基数函数,并产生以下谓词

where coalesce(cardinality(t0.ph_nums),0) = 0

isNotEmpty()

List<Contact> contacts = Contact.find
    .where()
    .phNums.isNotEmpty()
    .findList();

isNotEmpty() 使用基数函数,并产生以下谓词

where coalesce(cardinality(t0.ph_nums),0) <> 0