ORMLite完全解析(三)官方文档第三章、自定义查询构造器 Custom

下载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’))

还深深埋在心底,要除去,怕是不能活命。

ORMLite完全解析(三)官方文档第三章、自定义查询构造器 Custom

相关文章:

你感兴趣的文章:

标签云: