【问题标题】:Using if else statement for named query?使用 if else 语句进行命名查询?
【发布时间】:2011-05-28 04:26:28
【问题描述】:
@NamedQueries(  
   {   
 @NamedQuery(name = "GetAvailableProducts", query = new StringBuilder("").append("SELECT p   FROM Product p WHERE p.type= :type AND (p.available = 'ALL' OR").append(isTest() ? "(p.available = 'TEST' OR)"  : " ").append("p.available = :available)")),  
 }

这给了我一个错误,它无法识别 isTest() 方法。如果我像 if(1==1) 或类似的那样放置 if 语句,而不是这种方法,它会在 Intellij IDEA 中显示“属性必须是常量”。如何解决?

【问题讨论】:

  • 有什么棘手的方法可以做到。例如,定义两个具有相同名称“GetAvailableProducts”的 namedQueries 并将它们放在一个抽象类中。并在我的命名查询类中实现它。但是,namedQuery 将激活我想要的那个。所以我会被选一个namedQuery,我不会再改变我的namedQuery了。但我想拥有一次这样的权利..

标签: java jpa annotations entity named-query


【解决方案1】:

Java注解的参数只能是编译时常量。这行不通。

参考页面: Annotations

引用:

一旦定义了注解类型,您就可以使用它来注解声明。注释是一种特殊的修饰符,可以在其他修饰符(如 public、static 或 final)可以使用的任何地方使用。按照惯例,注释在其他修饰符之前。注释由一个 at 符号 (@) 后跟一个注释类型和一个带括号的元素-值对列表组成。 这些值必须是编译时常量。

【讨论】:

  • 我可以对 namedQuery 使用 SQL IN() 语句吗?
  • NamedNativeQuery 中可以使用SQL,在NamedQuery 中可以使用JPQL。 in() 应该在两者中都可用
【解决方案2】:

我不相信您可以通过 NamedQuery 执行此操作。

要么创建多个命名查询,要么使用动态查询:

 Query query = em.createQuery(...); 

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 2023-02-11
    • 2013-11-23
    • 2015-05-04
    • 1970-01-01
    • 2015-05-16
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多