Java Hibernate条件在生成的SQL语句中创建“?”

Java Hibernate条件在生成的SQL语句中创建“?”,java,hibernate,annotations,sql-server-2008-r2,Java,Hibernate,Annotations,Sql Server 2008 R2,我创建了一个示例web应用程序。我使用MS SQL Server 2008作为数据库,并使用hibernate+注释访问数据库。我的hibernate配置xml如下所示。 问题是,Criteria.list返回一个空列表,而且我在生成的HSQL中看到的是一个“?”而不是我在Criteria中传递的参数 <session-factory name=""> <property name="hibernate.connection.driver_class">sun.j

我创建了一个示例web应用程序。我使用MS SQL Server 2008作为数据库,并使用hibernate+注释访问数据库。我的hibernate配置xml如下所示。 问题是,Criteria.list返回一个空列表,而且我在生成的HSQL中看到的是一个“?”而不是我在Criteria中传递的参数

<session-factory name="">
    <property name="hibernate.connection.driver_class">sun.jdbc.odbc.JdbcOdbcDriver</property>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="hibernate.connection.url">jdbc:odbc:dbname</property>

    <property name="connection.pool_size">10</property>
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>       

     <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>       
    <property name="hibernate.connection.username"></property>
    <property name="hibernate.connection.password"></property>

<mapping class="com.demo.Person" />
</session-factory>
生成的HSQL:

除此之外,我也没有任何例外。你能帮我解决这个问题吗。 谢谢

将其更改为criteria.addRestrictions.likefirstname,name+%;帮助 顺便说一下,还有?是jbdc语句的正确参数占位符

而不是这条线

criteria.add(Restrictions.like("firstname", name, MatchMode.START)); 
试一试

如果将firstname作为abcd传递,它将以firstname的形式生成SQL,如“%abcd%”

你能试试这个吗

session = HibernateUtil.getSessionFactory().openSession(); 
List<Person> personList = session.createQuery("Select * from Person p where p.firstname like 'rake%'").list();

System.out.println("Person result :" + personList .size());

@请尝试以下代码:

criteria.add(Restrictions.ilike("firstname", name +"%"));

“?”是JDBC语句中参数的占位符。你看不到它的实际价值,仅此而已。这没有问题,只是hibernate的跟踪仍然不完整


如果要查看“?”的实际值,则必须使用额外的产品,如。

代码中似乎没有错误。您是否已选中手动将查询写入DB,它是否返回任何结果?是的,如果我在management studio中执行查询,它将返回结果。但是在上面的代码中,它返回的是空列表。?用于准备语句-此处无错误。当您手动执行查询时,您将替换什么?和谁一起去的?只是名称的值作为参数传递给JDBC驱动程序的标志!而不是直接在SQL子句中。我怀疑返回列表为空的原因是其他原因。好的,但是如果我在ManagementStudio中执行相同的查询,那么我就能够得到结果。我还遗漏了什么吗?我尝试了同样的方法,使用查询并对查询进行硬编码,这样效果很好。但是使用条件并不能获取任何结果!您确定在一个数据库实例上同时运行这两个查询吗?也许它指向不同的数据库,这就是你可以得到不同结果的原因。我的系统中只有一个数据库,我确信我在同一个数据库上运行了两个查询。正如你在上一篇评论中提到的,我看到你在查询中使用了不同的字段。只要在条件中将firstname更改为name,它就会工作。我使用Query和硬编码对查询进行了相同的尝试,这样效果很好。但是使用条件并不能获取任何结果!ANYWHERE还返回一个空列表:数据库表中是否有该名字的记录?请共享您正在执行且返回结果的SQL查询。我在该表中没有记录。返回结果的SQL查询是:选择*FROM person,其中firstname(如“rake%”)@Rakesh“name”和“firstname”是不同的字段?
criteria.add(Restrictions.like("firstname", name, MatchMode.START)); 
criteria.add(Restrictions.like("firstname", name, MatchMode.ANYWHERE)); 
criteria.add(Restrictions.ilike("firstname", name, MatchMode.ANYWHERE)); 
session = HibernateUtil.getSessionFactory().openSession(); 
List<Person> personList = session.createQuery("Select * from Person p where p.firstname like 'rake%'").list();

System.out.println("Person result :" + personList .size());
criteria.add(Restrictions.ilike("firstname", name +"%"));