我遇到了一个似乎很容易解决的问题,但表现出了弹性。 也就是说,我正在制作一个具有模糊搜索功能的网络平台。现在,搜索应返回一个对象列表(在我的情况下都是模型),并在屏幕上以单独的选项卡显示它们。
BlurrySeach(适用于个人资料):
public List<Profile> blurrySearch(String keyword) {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("select p from Profile p where p.username LIKE :keyword order by p.username");
query.setParameter("keyword", "%" + keyword + "%");
List<Profile> profileList = query.list();
session.flush();
return profileList;
}
此方法是来自界面的实现:
List<Profile> blurrySearch(String title);
现在,我找不到重载此方法的方法,因为将List<Profile>
更改为List<Photos>
不会更改返回类型,也不会更改方法重载所需的参数列表。
将界面更改为List blurrySearch(String title)
也不会改变任何内容。
将blurrySearchProfile
,blurrySearchPhotos
,blurrySearchBlogs
,blurrySearchShops
等作为单独的方法制作是低效的。
如何重载此方法,返回5个列表,例如profileList
将其传递给controller
,然后在jsp
上呈现?
这是JSP代码:
<div class="container-wrapper">
<div class="container">
<div class="page-header">
<h1>Explore</h1>
<p class="lead"> Search results! </p>
</div>
<!--
<div style=" width: 75%; margin: 0 auto;">
<div class="galleryImage">
<c:forEach items="${profileList}" var="profile">
<div class="imageWrapper">
<a href="<spring:url value="/users/${profile.username}"/>"
style="max-height: 25%; max-width:25%; left: 50%;">
<img src="<c:url value="/resources/images/cosplay/profilePhotos/${profile.username}-prof.png"/>" alt="image"
style="max-height: 90%; max-width:90%; display: block; margin-left: auto; margin-right: auto;">
</a>
<div style="text-align:center;">
<h3>${profile.username}</h3>
</div>
</a>
<hr>
<h3>${profile.description}</h3>
</div>
</c:forEach>
</div>
</div> -->
<div class="w3-bar w3-black">
<button class="w3-bar-item w3-button" onclick="openTab('Photos')">Photos</button>
<button class="w3-bar-item w3-button" onclick="openTab('Profiles')">Profiles</button>
<button class="w3-bar-item w3-button" onclick="openTab('Tutorials')">Tutorials</button>
<button class="w3-bar-item w3-button" onclick="openTab('Blogs')">Blogs</button>
<button class="w3-bar-item w3-button" onclick="openTab('Shops')">Shops</button>
</div>
<!-- START PHOTOS -->
<div id="Photos" class="tab">
<h3>Photos</h3>
</div>
<!-- END PHOTOS -->
<!-- START PROFILES -->
<div id="Profiles" class="tab">
<h3>Profiles</h3>
</div>
<!-- END PROFILES -->
<!-- START TUTORIALS -->
<div id="Tutorials" class="tab">
<h3>Tutorials</h3>
</div>
<!-- END TUTORIALS -->
<!-- START BLOGS -->
<div id="Blogs" class="tab">
<h3>Blogss</h3>
</div>
<!-- END BLOGS -->
<!-- START SHOPS -->
<div id="Shops" class="tab">
<h3>Shops</h3>
</div>
<!-- END SHOPS -->
</div>
</div>
提前谢谢!
答案 0 :(得分:2)
我们遇到了类似的问题。为了解决这个问题,我们在spring xml
中维护了2个地图<util:map id="entityToTableMap">
<entry key="Photos" value="tbl_photos"/>
<entry key="Profiles" value="tbl_profiles"/>
<entry key="Blogs" value="tbl_blogs"/>
</util:map>
<util:map id="entityToSearchFieldsMap">
<entry key="Photos" value="field_name"/>
<entry key="Profiles" value="username"/>
<entry key="Blogs" value="field_name"/>
</util:map>
我们创建了像这样的存储库方法
@Value("#{entityToTableMap}")
private Map<String, String> entityToTableMap;
@Value("#{entityToSearchFieldsMap}")
private Map<String, String> entityToSearchFieldsMap;
public List<T> blurrySearch(String keyword,String entityType) {
String tableName = entityToTableMap.get(entityType);
String searchField = entityToSearchFieldsMap.get(entityType);
String sql ="select p from "+tableName+" p where p."+searchField+" LIKE :keyword order by p."+searchField
...
}
但是,在jsp上,我们无法弄清楚需要访问的字段。所以,我们使用jdbctemplate's queryForList
方法如下
@Autowired
JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> blurrySearch(String keyword,String entityType) {
String tableName = entityToTableMap.get(entityType);
String searchField = entityToSearchFieldsMap.get(entityType);
String sql ="select p from "+tableName+" p where p."+searchField+" LIKE ? order by p."+searchField
return jdbcTemplate.queryForList(sql, new String[]{"%"+keyword+"%"});
}
然后,在jsp上,我们使用类似的东西使其成为通用的
<c:forEach items="${entityList}" var="maps">
<c:forEach items="${maps}" var="mapEntry">
${mapEntry['username']}
</c:forEach>
</c:forEach>