为啥以下查询不适用于双 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 子句?的主要内容,如果未能解决你的问题,请参考以下文章