404mj.diandian.com/post/2014-03-17/40061278989
Seam中的Query组件
首先我们看一个订单表的查询语句:
select id,orderno,finalamount,timecreated from customerorder where ordertype=1 and shipstatus=3 order by time_created desc offset 10 limit 10
面的语句是选择最近的订单,返回10条结果(limit),从第10条开始(即第二页)(offset),根据订单创建时间(time_created)降序排列
我们看下seam中如何展示此结果:
一) CustomerOrderList类写法
@Name("customerOrderList")
public class CustomerOrderList extends EntityQuery {
private static final String EJBQL = "select customerOrder from CustomerOrder customerOrder";
private static final String[] RESTRICTIONS = {
"customerOrder.orderType = #{customerOrderList.customerOrder.orderType}",
"customerOrder.shipStatus = #{customerOrderList.customerOrder.shipStatus}"};
private CustomerOrder customerOrder = new CustomerOrder();
public CustomerOrderList() {
setEjbql(EJBQL);
setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
setMaxResults(25);
setOrder(“customerOrder.id asc”);
}
public CustomerOrder getCustomerOrder() {
return customerOrder;
}
}
这里介绍什么是Restrictions
Restriction 意为限制,即查询语句的约束条件.RESTRICTIONS 里面的字符串将会生成sql的where语句,其中的EL表达式的值由页面的参数提交而来,若值为空则不会生成where中的限制.稍后将介绍如何在页面中通过EL表达式来绑定后台的变量
介绍List类的几个变量:order orderDirection orderColumn
order : 指定返回结果的排序方 setOrder(“customerOrder.id asc”);
orderDirection与orderColumn 分别设置排序方向和排序的字段,主要在sort.xhtml排序模板中使用
firstResult :将用来生成sql中offset的值,表示返回第几个结果以后的数据
maxResults 将用来生成sql中的limit值,表示返回结果的最大个数
pageCount 分页的页数
List类的2个主要方法;getResultList getResultCount
getResultList 返回查询结果的List集合
getResultCount 返回查询结果的个数
二) page.xml写法
<param name="sort" value="#{customerOrderList.orderColumn}"/>
<param name="dir" value="#{customerOrderList.orderDirection}"/>
上述两个用来指定排序的字段和方向(升序\降序)
<param name="logic" value="#{customerOrderList.restrictionLogicOperator}"/>
指定RESTRICTIONS中元素的逻辑关系 (and , or)
<param name="firstResult" value="#{customerOrderList.firstResult}" />
<param name="maxResults" value="#{customerOrderList.maxResults}" />
即Query类中的firstResult 和maxResults变量
<param name=”orderType” value=”#{customerOrderList.customerOrder.orderType}”/>
<param name=”shipStatus” value=”#{customerOrderList.customerOrder.shipStatus}”/>
绑定RESTRICTIONS中EL表达式的值
*.page.xml中的各个参数由上个页面传递而来,下面是一个url示例
http://localhost:8080/luthai/CustomerOrderList.seam?sort=customerOrder.id&dir=desc&firstResult=10&maxResults=10&orderType=1&shipStatus=3&cid=3
当在浏览器地址中输入url时seam首先会去对应页面的page.xml中找到变量名称比如
<param name=”orderType” value=”{customerOrderList.customerOrder.orderType}”/>
会将orderType对应的值”1”绑定到customerOrderList.customerOrder.orderType , 然后会把RESTRICTIONS 字符数组构造成开头所讲的sql中的where语句, 最后去执行构造函数将查询送到数据库并取出数据放在resultList属性中
三)xhtml如何写
- 搜索表单
以上表单提交时会刷新本页面并将输入框中的值绑定到和本页面对应的page.xml中的param上.
其实传递参数的方法有很多种除了表单提交外还有:
(1)
链接
参数与参数之间用 &amt; 连接,但不推荐这样使用
(2)s:link
<f:param name="firstResult" value="10" />
<f:param name="orderType" value="1" />
<f:param name="shipStatus" value="3" />
2.搜索结果列表
<ui:include src="/layout/sort.xhtml">
<ui:include src="/layout/sort.xhtml">
我的理解:用图展示最好,但是有点麻烦,,就用文字吧。DAO在seam下有两种SessionBean 和POJO分别位于src\main 和src\hot文件夹下。sessionBean的实现即使EJB的知识,不过的强调。POJO主要由Seam提供内置的组件Home 和 Query .Home 命名为 :实体名+Home.java ,继承自EntityHome<实体名>,用来实现CRUD功能块!Query命名为:实体名+List.java,继承自EntityQuery<实体>用来实现查询功能。