当前位置: 首页 > 知识库问答 >
问题:

Criteria API-在ElementCollection中使用UPPER

楚硕
2023-03-14

我有一节课

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

我想使用JPA 2.0 Criteria API来搜索这些标签-但以不区分大小写的方式。因此,我想将搜索参数设置为UPPER,将列设置为UPPER(伪SQL:从p.id上的人员p连接标签t中选择p.*=t.pId其中上(t.name)=上('search chParameter');)

这是我的代码,标签上没有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();

其中搜索标记是输入参数。

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

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

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

谢谢你

共有3个答案

韩烈
2023-03-14

您需要从 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();

我省略了<code>查询。选择(根),不确定是否需要。Tou也可以省略构建器。Tag_上的literal()。名称,因为是字符串

如果我哪里错了,请编辑我的答案以供更多用户使用。

希望这有帮助。

谷梁英毅
2023-03-14
suburbCriteria = criteriaBuilder.equal( 
                    criteriaBuilder.upper(root.get(Property_.suburb)), 
                    criteriaBuilder.upper(criteriaBuilder.literal(searchBean.getSuburb())));
金和雅
2023-03-14

好,我终于有了解决方案:

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

一个人必须使用“.作为(..)”法。

 类似资料:
  • 问题内容: 给定以下结构,我想执行以下SQL的HQL或CriteriaQuery等效项: 我想找回与给定人员关联的位置列表,其creationDate在给定位置之后。 提前致谢! 标记 编辑***:我已经编辑了SQL,因为这有点误导。我不想独立查询位置。 问题答案: 这是不可能的,您无法查询。从JPA Wikibook: 嵌入式收藏 的映射可以被用来定义的集合 的对象。这不是对象的典型用法,因为对

  • 我有一个实体,它有一个包含更多字段的可选子实体。子实体同样有一个元素集合。 这在Hibernate中通常是不可能的,还是我遗漏了什么? 错误消息为:

  • 问题内容: 我有以下枚举: 我尝试将其映射为以下日期: 但是,它引发以下异常: 如何正确映射? 问题答案: 给未来的谷歌人!最终,我设法解决了这个问题,我只需要在代码中的其他地方放置注释, 如您所见,我在getter方法之前(而不是将其放在属性声明代码之前)写了注释代码,并解决了问题,任何可以解释我原因的人都将不胜感激。谢谢

  • 问题内容: 我的应用程序模型集中有一个User实体,其定义如下: 并且在我应用程序不同部分(控制器类)中的方法中,我正在检索并尝试按以下方式修改镜像列表: 这引发了一个错误,指出: 我怀疑这是由于我误解了标签的某些元素,但是没有人能阐明我该如何纠正它? 谢谢。 问题答案: 默认情况下,关联和元素集合是延迟加载的。 这意味着仅当需要调用一种收集方法时,才从数据库中加载收集元素。但是,当然,实体需要附

  • 最近,我在使用标准应用编程接口时遇到了问题。这是我第一次接触它。这是我的办公室实体的一部分。 目标-从特定的办公室实体获取工人实体列表。到目前为止,我已经知道如何通过以下方式实现目标: 它工作得很好,但我认为我太依赖JavaList接口方法而不是CriteriaAPI。我可以通过在Criteria中创建适当的查询来获取WorkerEntity(OfficeEntity中的字段“workers”)列

  • 我正在运行Hibernate 4.2.6。Final/JPA2,并尝试创建一个由@embedded对象组成的@ElementCollection列表,这些对象本身包含一个字符串的@ElementCollection列表。 但是,当尝试实例化EntityManager时,hibernate会抛出一个ContoptModificationException,我一点也不明白。 如果我注释掉我的