使用Criteria API进行查询

时间:2013-05-24 01:30:17

标签: jpa criteria-api

我正在使用Criteria API进行介绍,我在查询时遇到问题,我正在尝试这样做2天,所以我需要你的帮助。我必须从数据库中获取美国邮政编码,但由于美国在许多州和县都有同名城市,我已通过state, county and city to the Facade(字符串格式为“州 - 县 - 城市”),现在我必须使用Criteria API进行查询。因此,逻辑是将邮政编码放在state = "state_name", county = "county_name" and city = "city_name“,但我的努力没有给出任何结果。我调试了代码,它与"cq.where(...)"分开。通过教程,我认为这将工作: (例如,我传递的参数“城市”格式如下:HI - HAWAII - HONUMU所以我需要HONUMU的邮政编码)

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();

    for (String c : cities) {
        String[] b = c.split("-");
        String state= b[0].trim();
        String county= b[1].trim();
        String city = b[2].trim();


        Root<ZipCodes> zip = cq.from(ZipCodes.class);
        cq.select(zip);
        cq.where(cb.and(cb.equal(zip.<String>get("state"), state), 
                cb.equal(zip.<String>get("county"), county)), 
                cb.equal(zip.<String>get("city"), city));

        return em.createQuery(cq).getResultList();

1 个答案:

答案 0 :(得分:0)

你应该尝试从比较字符串创建一个表达式;这样:

    String state= b[0].trim();
    String county= b[1].trim();
    String city = b[2].trim();

    Expression<String> state_e = cb.literal(state);
    Expression<String> county_e = cb.literal(county);
    Expression<String> city_e = cb.literal(city);

    Root<ZipCodes> zip = cq.from(ZipCodes.class);
    cq.select(zip);
    cq.where(cb.and(cb.equal(zip.<String>get("state"), state_e), 
            cb.equal(zip.<String>get("county"), county_e)), 
            cb.equal(zip.<String>get("city"), city_e));

注意带有下划线e(_e)的“新”表达式,如表达式中所示。希望它能帮助你!

相关问题