解决org.hibernate.collection.PersistentSet 的页面取值

hibernate 一对多映射的属性类型是set类型,不是list

页面上就不能${pojo.relations[0].xx}这样取值

设有 public class pojo{

private String id

private set  relations;

}

 

public class relation{

private String id;

private String name;

}

如果是freemarker可以按照set取值的方式这样写

${poji.relations.iterator().next().id}//这里只取的第一个值

 

附上自己的一小段代码:

Java代码   收藏代码
  1. list = baseDao.findByHql(TUser.class, hql, null);  
  2.   if(null !=list && list.size()>0)  
  3.   for (TUser tUser : list) {  
  4.    super.getHibernateTemplate().initialize(tUser.getTOrganization());  
  5.    super.getHibernateTemplate().initialize(tUser.getTUserRoleRelates());  
  6.    //上面只能加载到TUserRoleRelates.id.role.roleId,如要获取roleName,roleDesc,继续加载!  
  7.    Set roleSet=tUser.getTUserRoleRelates();  
  8.    if(!roleSet.isEmpty() && null!=roleSet){  
  9.    Iterator it=roleSet.iterator();  
  10.    //这里只取第一个结果,默认一个用户对应一个角色  
  11.    TUserRoleRelate tRelate=(TUserRoleRelate)it.next();  
  12.    //加载角色信息  
  13.    super.getHibernateTemplate().initialize(tRelate.getId().getTRole());  
  14.    }  
  15.   }  
  16.   return list;  

 ftl页面:

Ftl代码   收藏代码

  1. ${item.TUserRoleRelates.iterator().next().id.TRole.roleName!}  

注意判断roleSet有没有值


Java-Iterator的用法  

2012-06-20 17:36:29|  分类: Java|举报|字号 订阅

迭代器(Iterator)

  迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

  Java中的Iterator功能比较简单,并且只能单向移动:

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  (2) 使用next()获得序列中的下一个元素。

  (3) 使用hasNext()检查序列中是否还有元素。

  (4) 使用remove()将迭代器新返回的元素删除。

  Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

迭代器应用:
 list l = new ArrayList();
 l.add("aa");
 l.add("bb");
 l.add("cc");
 for (Iterator iter = l.iterator(); iter.hasNext();) {
  String str = (String)iter.next();
  System.out.println(str);
 }
 /*迭代器用于while循环
 Iterator iter = l.iterator();
 while(iter.hasNext()){
  String str = (String) iter.next();
  System.out.println(str);
 }
 */

记录一下,因为之前遇见的spring-data-jpa相关业务都是很简单的处理掉了。 


场景如下:很简单的CMS常用查询,栏目下有多个子栏目,子栏目有包含内容。 

Java代码   收藏代码
  1. public class Channel{  
  2. ....  
  3. private String parentIds;//所有的父节点,简化查询策略 例如 0,1,11,   
  4. private List<Channel> channels = Lists.newArrayList(); //所有的儿子栏目  
  5. ...  
  6. }  
  7.   
  8. public class Content{  
  9.     private Channel channel; //属于哪个栏目  
  10. }  


所以比如有如下结构时:栏目A下有两个子栏目B,C;这三个栏目下都有各自的内容, 那么当查询A下的内容时,肯定也是要包含B,C栏目下的内容。 

比如说A栏目的id是 10 ,再加上别的查询条件的话, 也就是说 sql 语句肯定是类似: 


Java代码   收藏代码
  1. select * from Content as s where (s.channel.id = 10 or s.channel.parentIds like '%,10,%') and s.yyy = 'xxxxx' and s.xxx = 'yyyy';  


想来想去发现实在没有简单的办法做or查询之后跟动态的and查询参数,好像只能自己构造,所以在此记录一下,避免忘记。 

此处动态的and 查询条件构造是使用了springside的方法。并且我不知道这样的构造方法是不是spring-data-jpa的标准做法,如果不是,请指正 

Java代码   收藏代码
  1. /** 
  2.      * 查询某个栏目下的所有文章,并且分页。 
  3.      *  
  4.      * 如该栏目下有子栏目,则需要一起显示 
  5.      *  
  6.      * @param channelId 栏目id 
  7.      * @param searchParams 
  8.      * @param pageNumber 
  9.      * @param pageSize 
  10.      * @return 
  11.      */  
  12.     public Page<Content> getContentListPaged(final Integer channelId,final Collection<SearchFilter> filters,int pageNumber, int pageSize){  
  13.           
  14.         return contentDao.findAll(new Specification<Content>(){  
  15.               
  16.             @Override  
  17.             public Predicate toPredicate(Root<Content> root,  
  18.                     CriteriaQuery<?> query, CriteriaBuilder builder) {  
  19.   
  20.                 //path转化  
  21.                 List<Predicate> orPredicates = Lists.newArrayList();  
  22.                   
  23.                 Path<String> idPath = root.get("channel").get("id");  
  24.                 Path<String> parentIdsPath = root.get("channel").get("parentIds");  
  25.                   
  26.                 Predicate p1 = builder.equal(root.get("channel").get("id"), channelId);  
  27.                 orPredicates.add(builder.or(p1));  
  28.                 Predicate p2 = builder.like((Path)root.get("channel").get("parentIds"), "%," + channelId + ",%");  
  29.                 orPredicates.add(builder.or(p2));  
  30.                   
  31.                 //以下是springside3提供的方法  
  32.                 Predicate o = DynamicSpecifications.bySearchFilter(filters, Content.class).toPredicate(root, query, builder);  
  33.                   
  34.                 Predicate p = builder.or(orPredicates.toArray(new Predicate[orPredicates.size()]));  
  35.                 query.where(p,o);  
  36.                   
  37.                 return null;  
  38.                   
  39.             }  
  40.               
  41.         }, new PageRequest(pageNumber - 1, pageSize));  
  42.     }  


实际查询的输出sql如下,where之前省略: 
Java代码   收藏代码
  1. where  
  2.       content0_.channel_id=channel1_.id   
  3.       and (  
  4.           content0_.channel_id=21   
  5.           or channel1_.parentIds like ?  
  6.       )   
  7.       and (  
  8.           content0_.title like ?  
  9.       ) limit ?  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值