下载CSDN移动客户端微信开发学习路线高级篇上线Oracle 11g DataGuard深入探讨恭喜July新书上市
ORMLite完全解析(三)官方文档第三章、自定义查询构造器 Custom Query Builder
分类:Android开发
接着上一篇,下面是第三章的翻译整理,理解错误的地方还请批评指正。
原文档:
尊重原创,转载请说明出处,谢谢!
第三章、 自定义查询构造器
3.1 查询构造器基础
下面是使用查询构造器创建自定义查询语句的基本步骤。首先,以java常量的形式为属性设置列名,便于使用它
们进行查询。
@DatabaseTable(tableName = "accounts")
public class Account {
public static final String PASSWORD_FIELD_NAME = "password";
…
@DatabaseField(canBeNull = false, columnName = PASSWORD_FIELD_NAME)
private String password;
…
这样就允许我们使用password属性构建查询,而不需要在后面的查询中重命名属性,及时属性名,和列名一样也
应该这样做。
// get our query builder from the DAO
QueryBuilder<Account, String> queryBuilder = accountDao.queryBuilder();
// the ‘password’ field must be equal to "qwerty"
queryBuilder.where().eq(Account.PASSWORD_FIELD_NAME, "qwerty");
// prepare our sql statement
PreparedQuery<Account> preparedQuery = queryBuilder.prepare();
// query for all accounts that have "qwerty" as a password
List<Account> accountList = accountDao.query(preparedQuery);
如上面的代码,你可以通过Dao.queryBuilder()方法获得一个QueryBuilder对象,然后调用这个对象的方法,调
用queryBuilder.prepare()函数获得一个PrepareQuery对象,然后,将这个PrepareQuery方法传递到DAO的查询或者
遍历方法中。
简化操作,可以在Where对象中调用prepare()方法,如下所示:
// query for all accounts that have that password
List<Account> accountList = accountDao.query(
accountDao.queryBuilder().where()
.eq(Account.PASSWORD_FIELD_NAME, "qwerty")
.prepare());
也可以使用另外一种简化方法,通过QueryBuilder或者Where对象调用query()方法或者iterator()方法。如下:
// query for all accounts that have that password
List<Account> accountList =
accountDao.queryBuilder().where()
.eq(Account.PASSWORD_FIELD_NAME, "qwerty")
.query();
3.2 构建查询语句
下面是一些不相同的构建查询语句的方式。QueryBuilder类已经针对特殊使用和强大的用户进行了内部封装。
QueryBuilder<Account, String> queryBuilder =
accountDao.queryBuilder();
// get the WHERE object to build our query
Where<Account, String> where = queryBuilder.where();
// the name field must be equal to "foo"
where.eq(Account.NAME_FIELD_NAME, "foo");
// and
where.and();
// the password field must be equal to "_secret"
where.eq(Account.PASSWORD_FIELD_NAME, "_secret");
PreparedQuery<Account> preparedQuery = queryBuilder.prepare();
上面的语句会生成下面这样的sql语句
SELECT * FROM accountWHERE (name = ‘foo’ AND password = ‘_secret’)
如果你喜欢使用方法链进行操作,则上面的语句也可以这样写:
queryBuilder.where()
.eq(Account.NAME_FIELD_NAME, "foo")
.and()
.eq(Account.PASSWORD_FIELD_NAME, "_secret");
如果你喜欢使用括号将比较语句组合在一起,也可以这样用:
Where<Account, String> where = queryBuilder.where();
where.and(where.eq(Account.NAME_FIELD_NAME, "foo"),
where.eq(Account.PASSWORD_FIELD_NAME, "_secret"));
上面的三种调用方式会生成相同的sql语句。对于混合mixANDs和ORs的复杂查询而言,最后一种格式必须正确组装
,如下面这个查询:
Where<Account, String> where = queryBuilder.where();
where.or(
where.and(
where.eq(Account.NAME_FIELD_NAME, "foo"),
where.eq(Account.PASSWORD_FIELD_NAME, "_secret")
),
where.and(
where.eq(Account.NAME_FIELD_NAME, "bar"),
where.eq(Account.PASSWORD_FIELD_NAME, "qwerty")
)
);
这个语句会长生下面这样的sql语句:
SELECT * FROM account
WHERE ((name = ‘foo’ AND password = ‘_secret’)
OR (name = ‘bar’ AND password = ‘qwerty’))
还深深埋在心底,要除去,怕是不能活命。