一、
(1)数据库表:user_site,在创建时候没有建立外键关系.有表user和site。user_site是中间表,它们是多对多关系。
(2)用seam反向生成的实体是这样的:
public class UserSite implements java.io.Serializable {
private Long id;
private Long userId;
private Long siteId;
}
这里并没有对应关系。
(3)这样写查询的时候比较方便。
public List<Site> getSiteResults() {
Long userid = user2.getId();
siteList.setEjbql("select distinct(s) from UserSite userSite,Site s where userSite.siteId=s.id and userSite.userId = "+userid);
if(siteList.getResultCount()>0){
return siteList.getResultList();
}else{
return null;
}
}
这里一定要注意要加上distinct,因为是多对多的关系,在中间表中肯定有重复的数据,一定要过滤掉。
二、
(1)movie_actor表是中间表,但是它在创建的时候有设置外键。有movie和actor表,它们是多对多的关系。
(2)用seam反向生成实体时:代码如下:
public class MovieActor implements java.io.Serializable {
private Long id;
private Actor actor;
private Movie movie;
}
这里就有对应的关系。
(3)这时的查询语句就麻烦了。哈哈哈! 终于找到解决的办法了。
public List<Movie> getMovieResults() {
movieList.setEjbql("select distinct(movie) from Movie movie, MovieActor movieActor where movie.id=movieActor.movie.id and movieActor.actor.id = "+actorId);
if(movieList.getResultCount()>0){
return movieList.getResultList();
}else{
return null;
}
}
上面那个方法太复杂啦,知道主键ID,可以有更快的办法来找到这个类对象。下面是代码:
public StorageServer getStorageServerObject(Long storageServerId){
if(storageServerId != null && !"".equals(storageServerId)){
return entityManager.find(StorageServer.class, storageServerId);
}else{
return null;
}
}
三、
第一种的下拉列表框的代码:
(1)
<s:decorate id="serverIdField" template="../layout/edit.xhtml">
<ui:define name="label">website server</ui:define>
<h:selectOneMenu value="#{site.serverId}" style="width:115px;">
<f:selectItems value="#{siteHome.serverItems}"/>
<a:support event="onblur" reRender="serverIdField" bypassUpdates="true" ajaxSingle="true"/>
</h:selectOneMenu>
</s:decorate>
(2)后台java类:
@SuppressWarnings("unchecked")
public SelectItem[] getServerItems(){
Query query = entityManager.createQuery("select storageServer from StorageServer storageServer where storageServer.type = 2");
List<StorageServer> list = query.getResultList();
SelectItem[] serverItems = new SelectItem[list.size()+1];
serverItems[0] = new SelectItem("","");
if (list.size() > 0){
for (int i = 0; i < list.size(); i++){
StorageServer server = list.get(i);
serverItems[i+1] = new SelectItem(server.getId(),server.getName());
}
}
return serverItems;
}
第二种的下拉列表框:
(1)这里的页面中还要加个标签库:
xmlns:c="http://java.sun.com/jstl/core"
<s:decorate id="selectsites" template="../layout/edit.xhtml" >
<ui:define name="label">Select Sites</ui:define>
<h:selectManyMenu value="#{newscreate.chosesites}" style="float:left;width:115px;height:80px;">
<c:forEach items="#{newscreate.siteResults}" var="site">
<f:selectItem itemValue="#{site.id}" itemLabel="#{site.name}"></f:selectItem>
</c:forEach>
</h:selectManyMenu>
</s:decorate>
(2)后台java代码:
public List<Site> getSiteResults() {
Long userid = user2.getId();
siteList.setEjbql("select distinct(s) from UserSite userSite,Site s where userSite.siteId=s.id and userSite.userId = "+userid);
if(siteList.getResultCount()>0){
return siteList.getResultList();
}else{
return null;
}
}