我有两个实体,foo和bar。一个foo可以有0-n条。
在foo和bar中,我有以下数据:
---- foo-table (2 rows) --- ---- bar-table (1 row) ----
fooID barID fk_foo
1 1 1
2 Foo和bar在restful服务中,我喜欢查找拥有id为2的foo的酒吧的数量。
因为fooID#2没有引用条,所以计数应该是0。这里是我的问题:服务报告我引用foo#2的条数是1而不是0!
我的控制器:
@Autowired(required = false)
private final BarFilter[] filters = new BarFilter[0];
/**
* Count all bars available.
*/
@RequestMapping(value="/bar", method = RequestMethod.HEAD)
public void countBar(final HttpServletResponse response, final HttpServletRequest request) {
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
final Root<Bar> root = criteriaQuery.from(Bar.class);
criteriaQuery.select(criteriaBuilder.count(root));
for (final BarFilter filter: filters) {
filter.count(request, criteriaQuery, root, criteriaBuilder);
}
final Query query = entityManager.createQuery(criteriaQuery);
final Number count = (Number)query.getSingleResult();
LOG.info("Found " + count + "x Bar.");
response.setIntHeader("count", count.intValue());
}这是BarFilter实现的count-method:
@Override
public void count(HttpServletRequest request, CriteriaQuery<Long> query, Root<Bar> root, CriteriaBuilder builder) {
final Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
final String name = parameterNames.nextElement();
String prop = name;
if (!prop.contains("[]")) {
prop = prop.replace("]", "");
prop = prop.replace("[", ".");
final String[] split = prop.split("\\.");
Path<Object> path = null;
try {
final Root<Bar> r = query.from(Bar.class);
for (final String property : split) {
if (path == null) {
path = r.get(property);
} else {
path = path.get(property);
}
}
query.where(builder.equal(path, request.getParameter(name)));
} catch (final IllegalArgumentException e) {
System.out.println(prop + " not found");
}
}
}
}这是jQuery-Request:
jQuery.ajax({
url: 'rest/bar',
type: 'HEAD',
dataType: 'json',
data: {foo:{id:2}},
success: function(data, state, xhr){
alert(xhr.getResponseHeader('count'));
},
error: function(err) {
alert('error:' + err.status);
}
});Chrome在网络选项卡中给了我这个请求:http://localhost:8080/MyServer/rest/bar?foo%5Bid%5D=2,它有这个查询字符串:

和这个响应头:

问:为什么我的计数变成1而不是0?
发布于 2016-04-24 13:52:38
啊,几个小时后我就明白了。
我有两个.from(...),在Restfull countBar-Method中,另一个在count-method中。这将创建一个交叉联接并读取两次数据,只有第二个where成为where子句。
https://stackoverflow.com/questions/36807470
复制相似问题