为什么以下查询不能使用双LIKE子句?

时间:2014-01-30 16:54:45

标签: java google-app-engine jpa persistence google-cloud-datastore

我正在使用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子句可以正常工作。

2 个答案:

答案 0 :(得分:4)

AppEngine将您的GQL查询转换为低级数据存储API查询。根据{{​​3}} Java文档,“不等式过滤器最多只限于一个属性”。这通常是因为索引选择。 LIKE运算符变为不等式过滤器,不能同时应用于同一查询中的.user和.nameBord属性。

答案 1 :(得分:0)

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

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

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