【问题标题】:Making query with Criteria API使用 Criteria API 进行查询
【发布时间】:2013-05-24 01:30:17
【问题描述】:

我正在使用 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();

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

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

        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) 的“新”表达式,如表达式中所示。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 2019-02-05
      • 2010-12-15
      • 2011-05-14
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多