0

我正在使用 ORMlite,我想知道是否可以在一个表中有多个标识列。

我有一个表,其中包含两个特定列:ID 和 Number。如果 ID 和 Number 相同,我希望 ORMlite 只更新该行,否则它应该创建一个新行。我正在使用方法createOrUpdate

谢谢。

4

2 回答 2

2

如果 ID 和 Number 相同,我只希望 ORMlite 更新该行,否则它应该创建一个新行(我使用的是方法 createOrUpdate)。

是的,您将无法使用,createOrUpdate(...)但是您应该能够添加自己的 DAO 方法来很好地模拟它。如果ID不是唯一的,那么您需要创建另一个 ID 字段作为身份并将您的ID字段用作另一个字段,可能有uniqueCombo限制。

@DatabaseField(generatedId = true)
private int uniqueId;
// not the id field because it is not unique
@DatabaseField
private int id;
@DatabaseField
private int number;

在您的 DAO 类中,覆盖BaseDaoImpl该类并覆盖该createOrUpdate(...)方法。它应该执行以下操作:

public CreateOrUpdateStatus createOrUpdate(Foo data) throws SQLException {
    QueryBuilder<Foo, Integer> qb = queryBuilder();
    // NOTE: id here is not the identity field
    qb.where().eq("id", data.id).and().eq("number", data.number);
    Foo existing = qb.queryForFirst();
    if (existing == null) {
        int numRows = create(data);
        return new CreateOrUpdateStatus(true, false, numRows);
    } else {
        int numRows = update(data);
        return new CreateOrUpdateStatus(false, true, numRows);
    }
}

作为优化,您可以使用ThreadLocalSelectArgid 和 number args 的参数预先创建该查询,然后只需设置 args 并在createOrUpdate(...)方法中运行查询。

于 2013-06-06T12:29:07.370 回答
1

通读这篇文章和 ORMLite 文档; 多个主键 - ORMlite

我不能 100% 确定这个答案。uniqueCombo = true 似乎是一个很好的猜测,但我不确定诸如更新和删除之类的东西是否仍然有效。你必须自己测试它。

于 2013-06-06T08:04:38.357 回答