`

seam反向生成实体和查询解说

阅读更多

 一、
(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;
		}
		
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics