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

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

概述          接着上一篇,下面是第三章的翻译整理,理解错误的地方还请批评指正。           原文档:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#Statement-Builder           尊重原创,转载请说明出处,谢谢! http://blog.csdn.net/oyangyujun  

接着上一篇,下面是第三章的翻译整理,理解错误的地方还请批评指正。

原文档:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#Statement-Builder

尊重原创,转载请说明出处,谢谢!http://blog.csdn.net/oyangyujun


第三章、 自定义查询构造器


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 account WHERE (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, where.eq(Account.PASSWORD_FIELD_name,"_secret") ), where.and( where.eq(Account.name_FIELD_name,"bar"),"qwerty") ) );
这个语句会长生下面这样的SQL语句: SELECT * FROM account WHERE ((name = 'foo' AND password = '_secret') OR (name = 'bar' AND password = 'qwerty'))
查询语句也允许指定需要查询返回的列,指定ORDER BY和GROUP BY属性,以及各种各样的sql特点,比如(liKE,IN,>,>=,<,<=,<>,IS NulL,disTINCT,...),具体细节查看Where CapabilitIEs这节。也可以查看good sql reference site中关于queryBuilder和Where语句的java文档介绍。 3.3 构建更新和删除语句 DAO对象也可以用于构建自定义的UPDATE和DELETE语句,UPDATE语句用于改变满足Where条件的数据行中特定的属 性的值,或者,如果没有指定where的话,用于更改所有数据行的属性值。delete语句用于删除满足条件的数据行, 如果没有条件限制,则用于删除所有数据。 例如,如果你想要更新全部Account中passwords为null的值为“none”,可以使用下面的语句。 UpdateBuilder<Account,String> updateBuilder = accountDao.updateBuilder(); // update the password to be "none" updateBuilder.updateColumnValue("password","none"); // only update the rows where password is null updateBuilder.where().isNull(Account.PASSWORD_FIELD_name); updateBuilder.update();
通过update语句,也可以指定表达式更新 // update hasDog boolean to true if dogC > 0 updateBuilder.updateColumnExpression("hasDog","dogC > 0");
为了便于构造你的表达式,可以使用UpdateBuilder的escape方法escapeColumnname和escapeValue值,这个两个 方法可以携带一个String或者StringBuffer,这样可以避免列名和关键字冲突。 如果你想删除Account表中password为null的一行,可以使用下面的语句完成。 DeleteBuilder<Account,String> deleteBuilder = accountDao.deleteBuilder(); // only delete the rows where password is null deleteBuilder.where().isNull(Account.PASSWORD_FIELD_name); deleteBuilder.delete();

3.4 query功能 下面是关于queryBuilder各种查询调用的详情。可以查看queryBuilder类的最新JavaDoc文档获取更多信息。大 多数的方法都是返回queryBuilder对象,以便使用方法链。 具体细节参考 tutorial of sql commands.中的详情。 主要方法包括: distinct() groupBy(String columnname) groupByRaw(String sql) having(String sql) join(queryBuilder joinedqueryBuilder) leftJoin(queryBuilder joinedqueryBuilder) limit(Integer maxRows) offset(Integer startRow) orderBy(String columnname,boolean ascending) orderByRaw(String sql) prepare() selectColumns(String... columns) selectColumns(Iterable<String> columns) selectRaw(String... columns) where() query() queryForFirst() queryRawFirst() iterator() reset()

3.5 Where功能 下面是关于查询功能的详解,更多细节参考tutorial of sql commands. 主要方法包括: and() and(Where<T,ID> first,Where<T,ID> second,ID>... others) and(int numClauses) between(String columnname,Object low,Object high) eq(String columnname,Object value) exists(queryBuilder<?,?> subqueryBuilder) ge(String columnname,Object value) gt(String columnname,Object value) IDEq(ID ID) IDEq(Dao<OD,?> dataDao,OD data) in(String columnname,Iterable<?> objects) in(String columnname,Object... objects) in(String columnname,queryBuilder<?,?> subqueryBuilder) isNull(String columnname) isNotNull(String columnname) le(String columnname,Object value) lt(String columnname,Object value) like(String columnname,Object value) ne(String columnname,Object value) not() not(Where<T,ID> comparison) notin(String columnname,Object... objects) notin(String columnname,?> subqueryBuilder) or() or(Where<T,ID>... others) or(int numClauses) raw(String rawStatement) prepare() reset() query() queryRaw() queryForFirst() queryRawFirst() countOf() iterator()

3.6 使用select参数 select参数是一种使用在Where *** 作中的参数,这种参数可以直接指定为参数值(如上例子所示),或者作为一 个select参数对象。select参数可以用于后续设置参数值,他们会产生sql ‘?’,类似于jdbc的占位符。 例如: queryBuilder<Account,String> queryBuilder = accountDao.queryBuilder(); Where<Account,String> where = queryBuilder.where(); SelectArg selectArg = new SelectArg(); // define our query as 'name = ?' where.eq(Account.name_FIELD_name,selectArg); // prepare it so it is ready for later query or iterator calls Preparedquery<Account> preparedquery = queryBuilder.prepare();
// later we can set the select argument and issue the query selectArg.setValue("foo"); List<Account> accounts = accountDao.query(preparedquery); // then we can set the select argument to another // value and re-run the query selectArg.setValue("bar"); accounts = accountDao.query(preparedquery);
人们通常会试着创建一些具有参数的查询语句,并包含一些特定的符号,这些符号能自动生成SQL语句,并导致 语法错误。在这种情况下可以使用SelectArg。此外,如果你的参数使用户输入的,那么使用SelectArgs可以保护你 的程序避免sql注入问题。其次,特定的数据类型可以使用一种内部的SelectArg对象,因为对象的String值对于数据 库而言是不可靠的。例如java.util.Date。 注意:SelectArg对象不能再一个对象的多列中使用,如果你想要在另外一列中使用SelectArg,你必须重新实例 化一个新的对象。

3.7 使用列参数 假如你使用queryBuilder让一个值和列数据进行比较。那么可以使用ColumnArg: 例如: queryBuilder<Account,String> queryBuilder = accountDao.queryBuilder(); // List all of the accounts that have the same // name and password fIEld queryBuilder.where().eq(Account.name_FIELD_name,new ColumnArg(Account.PASSWORD_FIELD_name)); List<Account> results = queryBuilder.query(); ColumnArg也可以携带一个表名,这种方式在JION查询中用于比较一个表中的列和另一个表中的列的数据时比较 有用。详情查看Building Join QuerIEs一节。

3.8 构建连接查询 Ormlite支持基本的JION SQL查询,更多内容可查看JOIN documentation. 通过两个queryBuilder对象创建一个join查询,其中一个在DAO中,用于返回你的对象,另一个DAO与第一个DAO 相关联。其中一个必须是另一个的外部属性,否则,jion方法会抛出异常。 例如:假设你想要获得一个account集合,并且这些account有一个订单的amount值大于100刀。则可以这样写: queryBuilder<Order,Integer> orderQb = orderDao.queryBuilder(); orderQb.where().ge("amount",100.0F); queryBuilder<Account,Integer> accountQb = accountDao.queryBuilder(); // join with the order query List<Account> results = accountQb.join(orderQb).query(); 这里返回了所有的Account记录,并且,这些对象有一个对应的订单,这个订单有一个属性值大于100. Ormlite也支持leftJOIN的概念,意思是,在上面的例子中,在上面的语句中,没有订单的account也会被返回。 但是,Ormlite不支持RIGHT JOIN 和 FulL JOIN的概念。 注意,其他的ORM库使用JOIN语句从多张表中获取数据填充外部对象属性和外部对象集合。Ormlite不支持这种特 性。你只能使用它从一张表中获得数据。 总结

以上是内存溢出为你收集整理的ORMLite完全解析(三)官方文档第三章、自定义查询构造器 Custom Query Builder全部内容,希望文章能够帮你解决ORMLite完全解析(三)官方文档第三章、自定义查询构造器 Custom Query Builder所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存