【问题标题】:Criteria API - Using UPPER in a ElementCollection标准 API - 在 ElementCollection 中使用 UPPER
【发布时间】:2012-07-26 08:45:56
【问题描述】:

我有课

@Entity
public class Person{
...
@ElementCollection
private Set<String> tags;
...
}

我想使用 JPA 2.0 Criteria API 来搜索这些标签 - 但不区分大小写。因此,我想将搜索参数设置为 UPPER 并将列设置为 UPPER (伪 SQL:select p.* from Person p join Tags t on p.id=t.pId where upper(t.name)=upper('搜索参数');)

这是我在标签上没有 UPPER 的代码:

  CriteriaBuilder builder = this.em.getCriteriaBuilder();
  CriteriaQuery<Person> query = builder.createQuery(Person.class);
  Root<Person> root = query.from(Person.class);

  return this.em.createQuery(query.select(root).where(
     builder.isMember(builder.upper(builder.literal(searchTag)),
        root.get(Person_.tags)))).getResultList();

其中 searchTag 是输入参数。

如何将 UPPER 分配给 Person_.tags “列”?

换句话说,我想用 Criteria API 编写这个查询:

SELECT p FROM Person p JOIN p.tags t WHERE UPPER(t) = UPPER('searchString')

谢谢

【问题讨论】:

    标签: api jpa criteria


    【解决方案1】:

    好的,我终于有办法了:

      cQuery.where(
         builder.equal(
            builder.upper(cQuery.from(Relation.class).join(Relation_.aliase)
               .as(String.class)),
            builder.upper(builder.literal(alias))
            )
         );
    

    必须使用“.as(..)”方法。

    【讨论】:

      【解决方案2】:
      suburbCriteria = criteriaBuilder.equal( 
                          criteriaBuilder.upper(root.get(Property_.suburb)), 
                          criteriaBuilder.upper(criteriaBuilder.literal(searchBean.getSuburb())));
      

      【讨论】:

        【解决方案3】:

        您需要从 Person 调用连接标签上的上部和文字属性名称。

        CriteriaBuilder builder = this.em.getCriteriaBuilder();
        CriteriaQuery<Person> query = builder.createQuery(Person.class);
        Root<Person> root = query.from(Person.class);
        Join<Person, Tag> tags = root.join(Person_.tags);
        
        query.where(builder.isMember(
                builder.upper(builder.literal(searchTag)), 
                builder.upper(builder.literal(tags.get(Tag_.name)))
        ));
        
        return this.em.createQuery(query).getResultList();
        

        我省略了query.select(root),不确定是否需要。 Tou 也可以在 Tag_.name 上省略 builder.literal(),因为它是 String。

        如果我在某处错了,请为更多用户编辑我的答案。

        希望这会有所帮助。

        【讨论】:

        • 那行不通。我没有“标签”类,我只有一组字符串。此外,isMember 方法需要“Expression> paramExpression1”,并且 builder.upper 返回 Expression
        • 有趣的情况。除了在 getter 上使用属性访问之外,我想不出任何其他方法,但这会很麻烦。
        • 我刚刚将解决方案作为评论添加到我的问题中
        猜你喜欢
        • 2018-02-24
        • 1970-01-01
        • 2016-11-18
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        相关资源
        最近更新 更多