【问题标题】:Why this Hibernate JPQL query can't work?为什么这个 Hibernate JPQL 查询不能工作?
【发布时间】:2015-05-19 17:58:02
【问题描述】:

我是 HibernateJPQL 查询的新手,在尝试执行以下查询时遇到了一些问题。情况是这样的,我有:

1) 一个名为 KMCountryArea 的实体类,用于映射我的数据库中的 KM_COUNTRY_AREA 表:

@NamedQueries({
        //@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder  = :nomeFolder order by c.idCountryArea")
        @NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder  = :nomeFolder order by c.idCountryArea")
})

/*@NamedQuery(name = "kmCountryListByName", query = "SELECT country FROM KMCountryArea country WHERE country.nomeFolder  = :nomeFolder order by country.idCountry")*/

@Entity
@Table(name = "KM_COUNTRY_AREA")
public class KMCountryArea implements Serializable {

    @Id
    @GeneratedValue
    private Long idCountryArea;

    @Column(name = "nomeFolder")
    private String nomeFolder;

    //@Column(name = "country")
    //@OneToOne(mappedBy = "country", cascade = CascadeType.ALL)
    @OneToOne
    private KMCountry country;

    public Long getIdCountryArea() {
        return idCountryArea;
    }

    public void setIdCountryArea(Long idCountryArea) {
        this.idCountryArea = idCountryArea;
    }

    public String getNomeFolder() {
        return nomeFolder;
    }

    public void setNomeFolder(String nomeFolder) {
        this.nomeFolder = nomeFolder;
    }

    public KMCountry getCountry() {
        return country;
    }

    public void setCountry(KMCountry country) {
        this.country = country;
    }
}

如你所见,这个类和相关表只有 3 个字段:

  • 行 ID

    @Id
    @GeneratedValue
    private Long idCountryArea;
    
  • 与表中的 nomeFolder 列匹配的 nomeFolder 字符串:

    @Column(name = "nomeFolder")
    private String nomeFolder;
    
  • KMCountry 国家 代表与另一个 KMCountry 实体类的一对一 关系,该实体类定义在我的项目中,该实体类本身已将此字段定义为id private Long idCountry;

    @OneToOne
    private KMCountry country;
    

事实上,这个 Hibernate 实体类在我的数据库中正确生成了 KM_COUNTRY 表,这是我在数据库中看到的 KM_COUNTRY 表字段:

COLUMN NAME          DATA_TYPE           NULLABLE    DATA_DEFAULT   COLUMN_ID
--------------------------------------------------------------------------------
IDCOUNTRYAREA        NUMBER(19,0)          No           (null)             1    
NOMEFOLDER           VARCHAR2(255 CHAR)    Yes          (null)             2    
COUNTRY_IDCOUNTRY    NUMBER(19,0)          Yes          (null)             3    

我认为这是正确的,因为在我看来,KMCountryArea 实体类中定义的 3 个字段在 KM_COUNTRY 表中正确映射。

所以我在 KM_COUNTRY 表中手动插入了一行(通过插入查询,并执行这个简单的选择查询(在作为 DBMS IDE 的 Oracle SQL Developer 中):

select * from KM_COUNTRY_AREA where nomefolder = 'BRAZIL';

我得到以下正确结果:

IDCOUNTRYAREA        NOMEFOLDER      COUNTRY_IDCOUNTRY
------------------------------------------------------------
     2                 BRAZIL              715

现在我必须使用 JPQL 执行类似此查询的操作,而是获取一组行(在前一种情况下,它只有一个,但我可以获得更多行)我想获取 KMCountry 的列表 具有定义 id 的对象(在实体内部)等于 COUNTRY_IDCOUNTRY 值。

所以,如您所见,我实现了这个 JPQL 命名查询

@NamedQuery(name = "kmCountryListByName", query = "SELECT c FROM KMCountryArea c WHERE c.nomeFolder  = :nomeFolder order by c.idCountryArea")

然后,在我的项目中,我定义了执行上一个查询的 DAO 服务,实现了这个具体的类:

@Repository("kmCountryAreaService")
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class KMCountryAreaServiceImpl extends AbstractService implements KMCountryAreaService {

    public List<KMCountry> getCountryListByName(String folderName){
        List<KMCountry> list = getHibernateTemplate().findByNamedQuery("kmCountryListByName");
        return list;
    }

}

如您所见,它被定义为 Spring 存储库并实现了一个 KMCountryAreaService 接口,我仅列出了 CRUD 实现的方法(在此工作阶段仅存在 getCountryListByName() )

好的,然后在我的代码中(进入一个动作类)我执行这个操作:

List<KMCountry> kmCountryListAssociated = kmCountryAreaService.getCountryListByName("BRAZIL", folderName);

所以我希望检索 KM_COUNTRY 表中 NOMEFOLDER 字段值等于 BRAZIL 的 KMCountry 对象列表

但它不起作用,事实上,使用调试器,我看到执行进入 getCountryListByName() 方法,但是当它尝试执行此语句时:

List<KMCountry> list = getHibernateTemplate().findByNamedQuery("kmCountryListByName");

抛出异常(但其消息未打印到堆栈跟踪中)。

我错过了什么?我该如何尝试解决这个问题?我快要疯了,想弄明白哪里出了问题。

Tnx

EDIT-1

我已经修改了 getCountryListByName() 方法来跟踪异常,现在我的方法是:

public List<KMCountry> getCountryListByName(String nomeFolder) {

    List<KMCountry> list = null;

    try{
        list = getHibernateTemplate().findByNamedQuery("kmCountryListByName", nomeFolder);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return list;
}

得到的异常是:

java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
    at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:55)
    at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:61)
    at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:397)
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:369)
    at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:985)
    at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:1)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedQuery(HibernateTemplate.java:979)
    at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedQuery(HibernateTemplate.java:975)
    at egp.prc.km.services.KMCountryAreaServiceImpl.getCountryListByName(KMCountryAreaServiceImpl.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy377.getCountryListByName(Unknown Source)
    at egp.prc.km.actions.countryArea.CountryAreaAction.showMultiSelectCountry(CountryAreaAction.java:205)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
    at egp.prc.km.utils.interceptors.LiferayAjaxInterceptor.intercept(LiferayAjaxInterceptor.java:28)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.servlet.StrutsServlet.service(StrutsServlet.java:76)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

【问题讨论】:

    标签: java sql spring hibernate jpql


    【解决方案1】:

    您没有将folderName 传递到查询中。试试这个

    List<KMCountry> list = getHibernateTemplate().findByNamedQueryAndNamedParam("kmCountryListByName", "nomeFolder", folderName);
    

    【讨论】:

    • 你能发布异常吗?
    • 你能逐行调试代码,看看它在哪一行中断了吗?然后,用try - catch 块包围该行并用e.printStackTrace() 打印catch 中的堆栈跟踪
    • 我想我知道是什么问题,更新了答案。
    • 不看代码就无法判断,但可能的原因是它适用于非命名查询的查询,或者您使用位置参数(?1)而不是命名参数(@987654327 @)。
    • 我指的是你提到的其他查询,没有findByNamedQueryAndNamedParam
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2012-08-19
    • 2017-03-07
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多