gpt4 book ai didi

java - 为什么不能对 ormlite 中具有 DataType.SERIALIZABLE 的列执行 isNotNull?

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:18 25 4
gpt4 key购买 nike

在 Android 上使用 ORMLite 4.48,考虑以下用户表...

@DatabaseTable(tableName = "users")
public class User {

@DatabaseField(columnName = Column.UUID)
protected String uuid;

@DatabaseField(columnName = Column.FIRST_NAME)
protected String firstName = null;

@DatabaseField(columnName = Column.LAST_NAME)
protected String lastName = null;

@DatabaseField(columnName = Column.ADDRESS, dataType = DataType.SERIALIZABLE)
protected Address address = null;

// ...
}

(地址类表示人类可读的地址,从纬度/经度转换而来)

...使用以下查询...

List<User> users = getDbHelper().getDao(User.class)
.queryBuilder()
.where()
.isNotNull(User.Column.ADDRESS)
.query();

...抛出此异常:

java.sql.SQLException: Field 'address' is of data type com.j256.ormlite.field.types.SerializableType@42ac7650 which can not be compared
at com.j256.ormlite.stmt.query.BaseComparison.<init>(BaseComparison.java:27)
at com.j256.ormlite.stmt.query.IsNotNull.<init>(IsNotNull.java:19)
at com.j256.ormlite.stmt.Where.isNotNull(Where.java:315)
...

显然,IS NOT NULL 子句不能用于存储为 DataType.SERIALIZABLE 的字段。

深入研究 ORMLite 代码,BaseComparison 构造函数检查 fieldType 是否具有可比性:

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/stmt/query/BaseComparison.java

protected BaseComparison(String columnName, FieldType fieldType, Object value, boolean isComparison)
throws SQLException {
if (isComparison && fieldType != null && !fieldType.isComparable()) {
throw new SQLException("Field '" + columnName + "' is of data type " + fieldType.getDataPersister()
+ " which can not be compared");
}

...
}

显然,SerializableType.isComparable() 返回 false:

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/field/types/SerializableType.java

@Override
public boolean isComparable() {
return false;
}

所以,我很清楚为什么会抛出异常。但为什么不能执行 Where.isNull()Where.isNotNull()?这是 SQLite 的限制还是 ORMLite 的作者做出了这个决定?

最佳答案

不确定“为什么”,但我相信“如何”是使用 ForeignCollectionField 而不是 DatabaseField

关于java - 为什么不能对 ormlite 中具有 DataType.SERIALIZABLE 的列执行 isNotNull?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26401154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com