JPA @NamedQuery,按位AND(&)作为标准

时间:2014-01-21 00:15:21

标签: mysql jpa datanucleus bitwise-and

有没有人知道如何使用按位AND(&)作为JPA NamedQuery的标准而不必使用@NamedNativeQuery?

我将状态位存储在一个字段中。

我正在使用以下defs作为视图的实体:

@NamedQueries({
    @NamedQuery(name="ViewProductsList.findAll", query="SELECT v FROM ViewProductsList v"),
    @NamedQuery(name="ViewProductsList.findFeatured", query="SELECT v FROM ViewProductsList v WHERE v.statusId & 16"),
    @NamedQuery(name="ViewProductsList.findBySubcategory", query="SELECT v ViewProductsList v WHERE v.subcatId IN (:subcatIds)"),
})

第一个工作正常,但第二个不喜欢表达式,我得到以下内容:

18:02:13,528 DEBUG [DataNucleus.Query] - JPQL Single-String with "SELECT v FROM ViewProductsList v WHERE v.statusId & 16"
18:02:13,553 DEBUG [DataNucleus.Query] - JPQL Query : Compiling "SELECT v FROM ViewProductsList v WHERE v.statusId & 16"
>>ERROR: 'Portion of expression could not be parsed: & 16'

在生产中使用开发MySQL数据库和Google Cloud SQL,因此它必须适用于两个版本......

有什么想法吗?

更新的问题:

使用定义的@NamedNativeQuery时如下:

@NamedNativeQuery(name = "ViewProductsList.findFeatured", query = "SELECT * FROM view_products_list v")

并按如下方式调用:

Query query=em.createNativeQuery("ViewProductsList.findFeatured", ViewProductsList.class);
List<ViewProductsList> list = query.getResultList();

我收到以下错误:

java.lang.IllegalStateException: You cannot invoke getResultList/getSingleResult when the Query is an UPDATE/DELETE
    at org.datanucleus.api.jpa.JPAQuery.getResultList(JPAQuery.java:161)
    at cultivartehidroponia.ProductsServlet.doGet(ProductsServlet.java:81) ...

我尝试了很多createNativeQuery示例,但没有成功。有人知道使用datanucleus工作本机查询示例吗?

同样,使用普通的@NamedQuery和createNamedQuery工作正常!

提前致谢!!!

2 个答案:

答案 0 :(得分:4)

Bitwise AND不是JPQL的一部分。但...

可以使用2条规则:

  1. 除以2 ^х会将位右移x(例如1011010/1000 = 1011)
  2. z mod 2 = 1如果右位为1(例如1011 mod 2 = 1)
  3. 尝试

    SELECT v FROM ViewProductsList v WHERE MOD(v.statusId/16 , 2) = 1
    

答案 1 :(得分:1)

'按位AND'是不是 JPQL的一部分。原生查询是可移植的方式。