java - HQL - 还记得序数参数是从 1 开始的吗?

标签 java hibernate orm

我试图通过 DAO 类匹配 hibernate 实体,第一个方法有效,但第二个“findByMatchingName()”失败,出现以下异常。这个子句 '%?%'> 有什么问题吗?

public class RunnerDaoImpl extends GenericDaoImpl implements RunnerDao
{
    protected Class<Runner> getEntityClass() {
        return Runner.class;
    }

    // Works
    public List<Runner> findByExactName(String name)
    {
        return super.getHibernateTemplate().find("from Runner r where concat(r.firstname,' ',r.surname) LIKE =",new String[]{name});
    }

    // Fails
    public List<Runner> findByMatchingName(String name)
    {
        return super.getHibernateTemplate().find("from Runner r where concat(r.firstname,' ',r.surname) LIKE '%?%'",new String[]{name});
    }
}

异常

java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
    at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:79)
    at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:85)
    at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:421)
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:393)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:918)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.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.find(HibernateTemplate.java:912)
    at ie.bhaa.dao.RunnerDaoImpl.findByName(RunnerDaoImpl.java:15)
    at ie.bhaa.dao.RunnerDaoTest.findRunnerByName(RunnerDaoTest.java:36)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)

最佳答案

您需要将 wildchar(%) 添加到参数而不是查询中。因此请按如下方式修改第二个查询。

// This will work!
public List<Runner> findByMatchingName(String name)
{
    return super.getHibernateTemplate().find(
    "from Runner r where concat(r.firstname,' ',r.surname) 
     LIKE ?",new String[]{"%"+name+"%"});
}

关于java - HQL - 还记得序数参数是从 1 开始的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155423/

相关文章:

java - 任务 ':common:kaptDebugKotlin' 执行失败。 > 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

java - 如何在项目上下文之外包含 Maven 模块?

java - 外键约束在一对多上失败

hibernate - Grails应用的tomcat服务器如何实现缓存自动刷新

hibernate - 在 hibernate 中调用 AES_ENCRYPT 函数

android - 自动删除 ORMLite 中的嵌套对象

java - 作为 KeyEvent 替代方案的键绑定(bind)仍然不起作用

Java套接字客户端超时

python - 在 Django 中保存序列化器

nhibernate - 与 NHibernate 相比,Entity Framework 4 的 POCO 支持如何?