1

我正在使用GAE的数据存储和JPA持久性框架来存储我的实体。尽管在试图检索某些特定实体时遇到了下面提到的问题。调用我的TypedQuery的getResultList()方法时为什么以下查询不能使用双LIKE子句?

下抛出异常: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子句可以正常工作。

+0

相关问题:http://stackoverflow.com/questions/47786/google-app-engine-is-it-possible- gql-like-query – victorantunes

回答

4

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

+0

纠正我,如果我错了,但'LIKE'不适合这个。以下是您发布的链接的引用:“一个查询可能不会在所有过滤器的多个属性上使用不等式比较(LESS_THAN,LESS_THAN_OR_EQUAL,GREATER_THAN,GREATER_THAN_OR_EQUAL,NOT_EQUAL)。”# – victorantunes

+2

@victorantunes:部分LIKE'前缀%'查询是作为具有不等过滤器的查询实现的 –

0

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

我建议使用搜索API进行搜索。这很容易,实用,快捷,你可以做更复杂的搜索:

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

相关问题