首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring RestFul jquery jpa-criteria - HEAD返回1而不是0

Spring RestFul jquery jpa-criteria - HEAD返回1而不是0
EN

Stack Overflow用户
提问于 2016-04-23 14:28:38
回答 1查看 40关注 0票数 0

我有两个实体,foo和bar。一个foo可以有0-n条。

在foo和bar中,我有以下数据:

代码语言:javascript
复制
---- 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

我的控制器:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2016-04-24 13:52:38

啊,几个小时后我就明白了。

我有两个.from(...),在Restfull countBar-Method中,另一个在count-method中。这将创建一个交叉联接并读取两次数据,只有第二个where成为where子句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36807470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档