我正在使用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子句可以正常工作。
答案 0 :(得分:4)
AppEngine将您的GQL查询转换为低级数据存储API查询。根据{{3}} Java文档,“不等式过滤器最多只限于一个属性”。这通常是因为索引选择。 LIKE运算符变为不等式过滤器,不能同时应用于同一查询中的.user和.nameBord属性。
答案 1 :(得分:0)
它不起作用,因为App Engine的查询有限制。查询结果来自索引,您不能拥有支持2个或更多不等式过滤器的索引。
我建议使用Search API进行搜索。它简单,实用,快速,您可以进行更复杂的搜索: