参数化对象属性
有人能告诉我一个代码有效的方法来在spring mvc中根据从超链接发送给它的参数更改对象属性吗?
我正在修改spring petclinic示例应用程序,以便“所有者”详细信息页面可以显示特定“所有者”拥有的每种“宠物”的单独列表。 目前,“宠物”列表是每个“所有者”的属性,并且可以在jstl中作为owner.pets访问。 我想要的是我的jstl代码能够从jstl调用owner.cats,owner.dogs,owner.lizards等,并在网页的不同部分填充几个单独的列表,即使所有的猫,狗和蜥蜴存储在同一个基础数据表中。
我该如何做到这一点?
以下是JpaOwnerRepositoryImpl.java的相关方法:
@SuppressWarnings("unchecked") public Collection findByLastName(String lastName) { // using 'join fetch' because a single query should load both owners and pets // using 'left join fetch' because it might happen that an owner does not have pets yet Query query = this.em.createQuery("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); query.setParameter("lastName", lastName + "%"); return query.getResultList(); } @Override public Owner findById(int id) { // using 'join fetch' because a single query should load both owners and pets // using 'left join fetch' because it might happen that an owner does not have pets yet Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); query.setParameter("id", id); return (Owner) query.getSingleResult(); }
以下是Owner.java的相关方面:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") private Set pets; protected Set getPetsInternal() { if (this.pets == null) {this.pets = new HashSet();} return this.pets; } public List getPets() { List sortedPets = new ArrayList(getPetsInternal()); PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true)); return Collections.unmodifiableList(sortedPets); }
这是OwnerController.java的一部分,它管理url模式“/所有者”,我希望我的jstl能够在页面的不同部分单独列出猫,狗,蜥蜴等(不是在一个分组列表中,但是在几个单独的名单中。):
@RequestMapping(value = "/owners", method = RequestMethod.GET) public String processFindForm(@RequestParam("ownerID") String ownerId, Owner owner, BindingResult result, Map model) { Collection results = this.clinicService.findOwnerByLastName(""); model.put("selections", results); int ownrId = Integer.parseInt(ownerId); model.put("sel_owner",this.clinicService.findOwnerById(ownrId)); return "owners/ownersList"; }
既然你要求一个非详细的解决方案,你可以做这种半脏修复。
Owner.java
@Transient private Set cats = new HashSet ();
[…]
// Call this from OwnerController before returning data to page. public void parsePets() { for (Pet pet : getPetsInternal()) { if ("cat".equals(pet.getType().getName())) { cats.add(pet); } } } public getCats() { return cats; }
ownerDetail.jsp
[...] Cats
Name:
All pets
[...]
OwnerController.java
/** * Custom handler for displaying an owner. * * @param ownerId the ID of the owner to display * @return a ModelMap with the model attributes for the view */ @RequestMapping("/owners/{ownerId}") public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { ModelAndView mav = new ModelAndView("owners/ownerDetails"); Owner owner = this.clinicService.findOwnerById(ownerId); owner.parsePets(); mav.addObject(owner); return mav; }
- 如何使用@OneToMany集合进行分页
- 如何在Hibernate中创建INSERT IGNORE查询?
- Hibernate:无法初始化代理 – 没有Session(通过引用链……)
- 有关hibernate的复合模式的帮助
- 使用Spring Hibernate的Google Appengine Cloud SQL问题
- 为什么使用带有Oracle 10g方言的Hibernate使用JPA创建一个名为hibernate_sequence的序列?
- 如何使用JPA(Hibernate)创建与同一实体的关系?
- Spring,JPA和Hibernate – 如何在没有并发问题的情况下增加计数器
- 为什么hibernate将HibernateException更改为(未选中)RuntimeException