为啥以下查询不适用于双 LIKE 子句?

Posted

技术标签:

【中文标题】为啥以下查询不适用于双 LIKE 子句?【英文标题】:Why doesn't the following query work with double LIKE clause?为什么以下查询不适用于双 LIKE 子句? 【发布时间】:2014-02-23 02:50:36 【问题描述】:

我正在使用 GAE 的数据存储和 JPA 持久性框架来存储我的实体。虽然在尝试检索某些特定实体时遇到了下面提到的问题。

在我的 TypedQuery 上调用 getResultList() 方法时抛出以下异常:javax.persistence.PersistenceException: Illegal argument

    EntityManager em = Persistence.createEntityManagerFactory("test-persistence")
                           .createEntityManager();
    String q = "SELECT c FROM c TestBord c WHERE c.publiclyAvailible=true 
               AND c.avarageRating='5' 
               AND c.user LIKE 'user%' 
               AND c.nameBord LIKE 'bord%'";
    TypedQuery<TestBord> tq = em.createQuery(q, TestBord.class);
    List<TestBord> l = tq.getResultList();

如上所示,这是我正在使用的查询:

SELECT c FROM c KvCBord c WHERE c.publiclyAvailible=true 
AND c.avarageRating='5' 
AND c.user LIKE 'user%' 
AND c.nameBord LIKE 'bord%'

当我使用两个 LIKE 子句时,它似乎中断了,有人对如何解决这个问题有任何想法,或者知道如何正确重写查询?

注意:不过,只需一个 LIKE 子句就可以正常工作。

【问题讨论】:

相关问题:***.com/questions/47786/… 【参考方案1】:

它不起作用,因为 App Engine 的查询有限制。查询结果来自索引,不能有支持 2 个或更多不等式过滤器的索引。

我建议使用 Search API 进行搜索。它简单、实用、快速,而且您可以进行更复杂的搜索:

https://developers.google.com/appengine/docs/java/search/

【讨论】:

【参考方案2】:

AppEngine 将您的 GQL 查询转换为低级别的 Datastore API 查询。根据Restrictions on queries Java 文档,“不等式过滤器最多只能使用一个属性”。这通常是因为索引选择。 LIKE 运算符成为不等式过滤器,不能同时应用于同一查询中的 .user 和 .nameBord 属性。

【讨论】:

如果我错了,请纠正我,但LIKE 不适合这个。这是您发布的链接中的引述:a single query may not use inequality comparisons (LESS_THAN, LESS_THAN_OR_EQUAL, GREATER_THAN, GREATER_THAN_OR_EQUAL, NOT_EQUAL) on more than one property across all of its filters. @victorantunes: 部分 LIKE 'prefix%' 查询在底层实现为带有不等式过滤器的查询

以上是关于为啥以下查询不适用于双 LIKE 子句?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 寻呼机不适用于查询中的“LIKE”

“if”子句不适用于 clickhouse 中的插入查询

为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?

JDBC Like子句实例

如何在同一SQL查询中合并子句LIKE和BETWEEN?

PostgreSQL 函数不适用于 WHERE 子句