我有一个打印用户的用户界面,我不想按国家/地区进行过滤。
我制作了一个经典的<select />
元素。
在JSP中我有
<select id="country" onchange="return filter();">
<option value="">...</option>
<c:forEach var="country" items="${countries}">
<option value="${country.id}"
${country.name}
</option>
</c:forEach>
</select>
事情是有些用户没有国家,所以我需要处理2个过滤器: - 一个打印所有用户,没有过滤器 - 仅打印没有国家/地区的用户
所以我想知道对Java说什么是最好的方式:“找到我所有的用户”,“找到我没有国家的所有用户”。
我有一点想法:如果countryId = 0,服务器会将其转换为“没有国家/地区的用户,如果countryId = null,则服务器会将其转换为”所有用户“。
最后,DAO对象将进行类似
的查询public List<User> findByCountry(Integer countryId){
query = "select * from users"
if(countryId==0){
query+= " where country_id is null"
}
else if(countryId==null){
query += " where country_id = " + countryId;
}
return query results...
}
这样可以,或者这是丑陋的,还是有人有更好的模式来做到这一点?
答案 0 :(得分:1)
我实际上会提出两个DAO API:
public ... findAllUsers(...) {...}
public ... findAllUsersWithoutACountry(...) {...}
我认为,您的方法存在的问题是,由于动态SQL代码,您的API并不明确。这使您的同事更难理解您的代码。其次,这些是两个不同的任务,虽然它们相似,但最好提出两种明确的方法。这对于单元测试来说更容易,并且由于您在方法中的控制流量较少,因此您的圈复杂度较低。此外,代码更容易理解,因为其他开发人员不需要想知道为什么你正在测试countryId对0或null这不会向他们传达大量有意义的消息,除了它只是一个快速的黑客来解决你目前的问题。未来3周,您将会想知道为什么要自己测试这些奇怪的值。 :)
答案 1 :(得分:0)
我认为您的方法是正确的,但您可能希望让任何用户WHERE CountryID=0 || CountryID IS NULL
使用“所有用户”标签,这样您就可以过滤以查看没有国家/地区设置的任何人。然后,如果需要/需要,您可以修复这些用户。但我认为总的来说你的解决方案很好。