Java JPA命名查询问题

Java JPA命名查询问题,java,hibernate,jpa,Java,Hibernate,Jpa,正在访问以下数据库Exception,需要帮助 service() for servlet catalogservice threw exception: java.lang.IllegalArgumentException: Named query not found: SELECT OMX_PLAN_ID, PLAN_ID,DECODE(plan_id,0,ser_input_total_amount,first_payment) first_paymenmt From (SELECT OM

正在访问以下数据库Exception,需要帮助

service() for servlet catalogservice threw exception: java.lang.IllegalArgumentException: Named query not found: SELECT OMX_PLAN_ID, PLAN_ID,DECODE(plan_id,0,ser_input_total_amount,first_payment) first_paymenmt From (SELECT OMX_PLAN_ID, PLAN_ID,(SELECT DECODE(fraction,0,fixed_payment_amount, (( fraction/100) * :useinput_total_amount)) From TFN.VW_OMX_PAYMENT_PLAN_DETAILS i WHERE o.OMX_PLAN_ID=i.OMX_PLAN_ID AND i.OMX_PLAN_ID=:omxPlanId AND i.PAYMENT_ID=1) first_payment FM TFN.VW_OMX_PAYMENT_PLANS o ) WHERE OMX_PLAN_ID=:omxPlanId ORDER by 1
        at org.hibernate.ejb.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:704) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Fin
道方法 公共条款付款通过Total和Planidit planId查找首付金额,双倍总额{

    TypedQuery<TermPayment> query = entityManager.createNamedQuery("SELECT OMX_PLAN_ID, PLAN_ID,DECODE(plan_id,0,:user_input_total_amount,first_payment) first_paymenmt From (SELECT OMX_PLAN_ID, PLAN_ID,(SELECT DECODE(fraction,0,fixed_payment_amount, (( fraction/100) * :user_input_total_amount)) From TFN.VW_OMX_PAYMENT_PLAN_DETAILS i WHERE o.OMX_PLAN_ID=i.OMX_PLAN_ID AND i.OMX_PLAN_ID=:omxPlanId AND i.PAYMENT_ID=1) first_payment FROM TFN.VW_OMX_PAYMENT_PLANS o ) WHERE OMX_PLAN_ID=:omxPlanId ORDER by 1", TermPayment.class);
    query.setParameter("omxPlanId", planId);
    query.setParameter("user_input_total_amount", totalAmount);
    return   query.getSingleResult();
}
从java.persistence.EntityManager javadoc:


因此,您应该创建命名查询,并仅使用createNamedQuery引用它。

如果要从字符串创建查询,可以使用createQueryString查询,类类型方法

您可以替换DAO中使用的方法:

entityManager.createNamedQuery(...)
对于这一个:

entityManager.createQuery("select OMX_PLAN_ID, PLAN_ID ...", TermPayment.class)
或者,您可以在实体类中添加NamedQuery注释或使用xml创建NamedQuery。之后,您可以使用NamedQuery将NamedQuery名称传递给createNamedQuery方法

@NamedQuery(name="MyQuery", query="select OMX_PLAN_ID, PLAN_ID ...")

entityManager.createNamedQuery(MyQuery, TermPayment.class);
您试图使用NamedQuery api创建动态查询,这是错误的。 从

createNamedQuery方法用于创建静态查询,或使用javax.persistence.NamedQuery注释在元数据中定义的查询。@NamedQuery的name元素指定将与createNamedQuery方法一起使用的查询的名称。@NamedQuery的query元素是:

你需要做一些事情,比如

entityManager.createQuery 从Customer c中选择c,其中c.name类似于:custName
.setParametercustName,name

有两种方法查询createNamedQueryjava.lang.String名称类型查询createNamedQueryjava.lang.String名称,java.lang.Class ResultClass我看到了,那么为什么不坚持使用相应的javadoc呢?查询的选择列表必须只包含一个项,该项必须可分配给类型说明符被resultClass参数忽略。
entityManager.createQuery("select OMX_PLAN_ID, PLAN_ID ...", TermPayment.class)
@NamedQuery(name="MyQuery", query="select OMX_PLAN_ID, PLAN_ID ...")

entityManager.createNamedQuery(MyQuery, TermPayment.class);
@NamedQuery(
    name="findAllCustomersWithName",
    query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
)

Here’s an example of createNamedQuery, which uses the @NamedQuery:

@PersistenceContext
public EntityManager em;
...
customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();