您的位置:首页 > 移动开发 > Android开发

解决:android:editable is deprecated: Use an <EditText> to make it editable

2015-10-30 17:28 661 查看
al">Topic,Object数组的第2项的值就是null。

SELECT f, t FROM Forum f LEFT JOIN f.topics t 使用范例数据库,上面的查询会返回以下结果:

[ Object: [Forum] Object: [Topic] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ] 这个查询返回了所有的Forum实例和一个唯一的Topic,因为仅有一个Forum有一个Topic(看起来留言板需要更多的用户参与)。

由于LEFT JOIN操作符是预读取的一种有效方式,JPA还提供了FETCH JOIN操作。FETCH JOIN操作符在下一节介绍。

FETCH JOIN
fetch join允许你创建查询来预读取另外一种lazy关联关系。如果你了解到在所有的实体读取之后并可能处于脱管状态时就有必要使用LAZY关联关系,你就可以使用FETCH JOIN来读取这种关系。FETCH JOIN如下:

[LEFT [OUTER] INNER] JOIN FETCH join_association_path_expression和前面定义不同的是,FETCH JOIN没有范围变量,因为你不能在查询语句中使用隐式引用的实体。下面的查询会读取任何有主题(Topic)的论坛(Forum)实体,仅仅那有主题(Topic)的论坛(Forum)实体才会被读取。下面代码演示了如何定义论坛(Forum)实体。注意与主题(Topic)的关联关系是lazy。

@Entitypublic class Forum extends ModelBase implements Serializable { @OneToMany( fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE}, mappedBy="forum") @OrderBy("type asc, dateUpdated desc") Set<Topic> topics = new HashSet<Topic>(); // ...} 这里有一条查询语句:

SELECT DISTINCT f FROM Forum f JOIN FETCH f.topics 因为数据库中有5个Forum实例,但仅有一个有Topic。上面的查询语句会返回一个Forum实例,Topic的关联关系也立即读取。如果你不使用DISTINCT,持久化实现方案(persistence provider)会为系统中每个返回一个Forum实例。使用了DISTINCT,重复的实例会被删除。

要读取所有的论坛(Forum)实例,并立即读取它们的主题(Topic),如下在的查询语句所示,

SELECT DISTINCT f FROM Forum f LEFT JOIN FETCH f.topics 这条返回所有唯一的论坛(Forum)实例,并且所有的主题(topics)已经预先读取了。使用JOIN FETCH的一个缺点是需要知道对象模型。一旦你知道关联关系的类型,就可以用JOIN FETCH优化你的查询。

查询中的WHERE语句是由条件表达式组成,由它决定返回的实体。只要你将使用GROUP BY的字段放到SELECT语句中,你可以用GROUP BY来统计查询结果。你还可以用HAVING过滤查询结果。JPA并没有要求持久化实现在不使用GROUP BY支持HAVING,可以保持可移植性,你最好不要在GROUP BY外使用HAVING。

图 4. Post/User对象关系图

现在假设你想知道创建的agoraBB系统中每个用户的发帖数量。从上图中可以看,没有从User到Post的关联关系。因为User和Post继承ModelBase MappedSuperclass的,我们知道每个Post对象有一个createdByUser和updatedByUser字段。

使用inner join的话,你可以写查询语句:

SELECT count(p) From Post p JOIN p.createdByUser u 问题是,这条查询会返回所有的由createdByUser字段指定用户创建的所有帖子的数量。如果你想知道每个用户创建了多少帖子,你必须使用GROUP BY操作符:

SELECT u, count(p) From Post p JOIN p.createdByUser u GROUP BY uWHERE , GROUP BY , HAVING这条查询语句会返回一个User实例和他所创建帖子的数量。为了进一步缩小结果范围,你可以使用HAVING过滤分组信息(由GROUP BY标志)。下面的查询会返回User实例及他所发的帖子数量,前提是用户的密码是8个以上的字符。 SELECT u, count(p) From Post p JOIN p.createdByUser u GROUP BY u HAVING length(u.password) > 8 条件表达式(CONDITIONAL EXPRESSIONS)条件表达式可以用在一个JPQL查询的WHERE和HAVING语句中。你必须了解使用条件表达式时的一些约束。 条件表达式中包括LOB状态字段可能无法在数据库之间进行移植。 字符串使用单引号字符串包裹,如'this'。如果要在查询中使用单引号,就要两个一起使用。你无法在查询中使用Java转义方法(例如,\'代表单引号)。布尔(Boolean)字符用TRUE和FALSE表示(不区分大小写),数字字符遵从Java规范,不支持日期字符串。同样可以支持Enum,但是你必须使用Enum,全路径名称,如,com.sourcebeat.jpa.model.FTPType。 标识变量必须出现在一个SELECT或DELETE查询的FROM语句中。如果使用UPDATE,那么标识变量就必须在UPDATE语句中。标识变量往往表示他们所定义的实体类型,而不能表示一个集合中的实体。 你可以使用位置或者命名形式的输入参数,但不能在某一查询混合使用这两种形式。输入参数可以出现一个查询的WHERE语句和(或者)HAVING语句中。 位置形式参数的格式是以一个问号(?)打头紧跟一个以1开始的正整数。例如,?1。你可以在一个查询中多个使用同一位置参数,如下所示。 SELECT u FROM User u WHERE u.dateCreated = ?1 OR u.dateUpdated = ?1 命名形式的参数用一个冒号(:)加一个Java标志符如Java变量名来表示。命名参数表示如下: SELECT u FROM User u WHERE u.dateCreated = :aDate OR u.dateUpdated = :aDate 函数与表达式(FUNCTIONS AND EXPRESSIONS)JPQL支持函数功能,多种的IN,LIKE和BETWEEN样式表达式,及面向集合(collection)的条件表达式。这一节详细讨论写查询可用的各种选择。一个查询语句中操作符的优先级为: 导航操作符(.) 一元符号(+,-) 乘(*),除(/) 加(+),减(-) 比较操作符,=, >, >=, <, <=,<> (不等), [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF] 逻辑操作符,NOT, AND, OR BETWEEN你可以用BETWEEN操作符指定一个实体字段的范围。BETWEEN的语法是: expression [NOT] BETWEEN expression AND expression 这里expression可以是一个字符串,算术或日期时间表达式。这里有几个使用BETWEEN操作符的实例。 SELECT u FROM User u WHERE u.dateCreated between :startDate AND :endDateSELECT t FROM Topic t WHERE t.postCount NOT BETWEEN ?1 AND ?2 IN你可以利用IN比较操
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: