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

如何使用JPA标准API搜索日期字段中的字符串

白成济
2023-03-14

这是我的另一个问题的一个问题。当有人(@franck)给我指出这个链接和这个链接后,我想最好把它作为一个不同的问题来提。

这是我所做的;

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Client> cq = cb.createQuery(Client.class);
Root<Client> entity = cq.from(Client.class);
cq.select(entity);

List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%")); 

cq.where(predicates.toArray(new Predicate[]{}));
TypedQuery<Client> query = em.createQuery(cq); //<--- Error gets thrown here
return query.getResultList();

但它失败,但有以下例外情况;

java.lang.IllegalArgumentException: Parameter value [%10-2015%] did not
match expected type [java.lang.Character]

其中10-2015是要搜索的字符串;

共有1个答案

史谦
2023-03-14

好的,在对各种策略进行了大量的实验之后,下面是我最终成功的方法。

我在这里看到了这篇文章,突然想起了JPAtuple接口,它是一个可以返回多个结果类型的对象。因此,要执行我的like比较,并且由于日期不能简单地转换为字符串,下面是步骤;

  1. 我以元组
  2. 的形式获取列
  3. 检查元组对象,查看其是否可分配自日期
  4. 如果是,则获取日期格式表达式并将其传递给like表达式。
predicates.add(cb.like(cb.lower(entity.get("dateJoined").as(String.class)), "%"+search.toLowerCase()+"%")); 

现在,这是我有的工作很漂亮;

Path<Tuple> tuple = entity.<Tuple>get("dateJoined");
if(tuple.getJavaType().isAssignableFrom(Date.class)){
    Expression<String> dateStringExpr = cb.function("DATE_FORMAT", String.class, entity.get("dateJoined"), cb.literal("'%d/%m/%Y %r'"));
    predicates.add(cb.like(cb.lower(dateStringExpr), "%"+search.toLowerCase()+"%"));
}

注意-值得注意的事项-

  1. 我知道无论从何处发起搜索,我的所有日期都以以下形式显示07/10/2015 10:25:09 PM因此我能够知道如何将我的like表达式中的日期设置为“'%d/%m/%y%r'”
  2. 这只是适用于约会的一个步骤。大多数其他类型如int,long,char...等...都可以直接转换为String,随着我研究更多类型的数据,我肯定会对任何其他不能直接转换为String的类型执行同样的操作。

虽然这对我来说是完美的,但是在我将其标记为正确答案之前,我将对其进行一些更广泛的测试,在此过程中,任何对我的策略有保留意见的人都可以对其进行评论。

最后,对一个帮助过的人来说...干杯!

 类似资料:
  • 我有一个ISODate格式的“DateAdd”Mongo集合 所以现在是当地时间1小时后 当我尝试获取2018-08-31 06:00:00之后添加的记录时,使用以下查询,我无法获取UTC中的记录 在MongoDB中搜索日期字段时,如何转换UTC日期?

  • 我还没有为索引创建任何显式设置。谢了。

  • 我有一个elasticsearch索引,其中包含具有以下字段的用户:.“名称”:“凯”“年龄”:“23”“位置”:“德里,印度”“标签”:[“搜索”,“nosql”]等。 我想在用户的所有字段中查询多个字符串(例如:[“nosql”、“德里”)。可以使用Java API吗? 这是我正在使用的代码示例。(但与问题无关)这只是为了了解我现在使用的对象。 感谢提前。:)

  • 问题内容: 我想在文档中搜索“社交网络营销”。全部一起。但是我继续得到结果,单词分开。我有以下DSL查询: 我没有包含此短语和标题的文档,但是我也得到了包含短语单词的搜索结果(文档)以进行拆分。我要严格搜索。如果没有任何文档使用此短语,则不要检索任何文档或仅检索具有该标题的文档。为什么 运算符又 不起作用? 问题答案: 您可以使用类型词组尝试以下方法吗?看到这里说, 查询首先分析查询字符串以生成术

  • 我想搜索视频列表并用频道图标将其显示在屏幕上,但我不知道如何在搜索查询中获得频道id或频道图标直接链接。 我正在关注youtube的开发人员页面(Java)中的一个例子,我希望搜索结果包含channel_id或channel_icon,该怎么办? [已解决] 我已经解决了我的问题,我编辑了我的字段过滤器,完整代码: 我有 channelId,我可以得到 channel icon,只需将 url 替

  • 我在映射中设置了一个日期字段,如下所示: 在我的应用程序中,字段group psAssignedDate最初设置为空字符串。分配组时,将生成unix时间戳并将其存储在字段中。我试图使用elasticsearch的批量更新功能来引入一组带有“AssignedDate”的文档,因为还没有分配组。不过,Elasticsearch不会对文档进行索引。这在日志文件中: 弹力搜索似乎支持JSON空值...我需