Hibernate Criteria创建一个'?'在生成的SQL中

时间:2012-10-12 09:13:20

标签: 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.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>

这是我的注释bean

    @Entity
    @Table(name = "person")
    public class Person implements Serializable {

        public Person(){

        }
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO) 
        @Basic(optional = false)
        @Column(name = "personid")
        private Integer personid;

        @Basic(optional = false)
        @Column(name = "firstname")
        private String firstname;

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

        @Basic(optional = false)
        @Column(name = "phone")
        private String phone;

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

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

        @Basic(optional = false)
        @Column(name = "city")
        private String city;

        @Basic(optional = false)
        @Column(name = "country")
        private String country;

        @Basic(optional = false)
        @Column(name = "bussinessowner")
        private int bussinessowner;

        @OneToMany(cascade = CascadeType.ALL, mappedBy = "resultid1")
        private Collection<Recent> recentCollection;

//setters & getters
}

我正在运行的代码是

Session session;
        List list = new ArrayList();
        try{
        session = HibernateUtil.getSessionFactory().openSession();
        Criteria criteria = session.createCriteria(Person.class);
        criteria.add(Restrictions.like("firstname", name, MatchMode.START));
        list= criteria.list();
        System.out.println(list.size());

        }catch (Exception e) {
            e.printStackTrace();
        }

生成HSQL:

Hibernate: select this_.personid as personid2_0_,  this_.city as city2_0_, this_.country as country2_0_, this_.firstname as firstname2_0_, this_.lastname as lastname2_0_ from person this_ where this_.firstname like ?

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

4 个答案:

答案 0 :(得分:0)

将其更改为criteria.add(Restrictions.like("firstname", name + "%"));是否有帮助? 顺便说一句,?jbdc语句的正确参数占位符。

答案 1 :(得分:0)

而不是这一行

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

criteria.add(Restrictions.like("firstname", name, MatchMode.ANYWHERE)); 

OR

criteria.add(Restrictions.ilike("firstname", name, MatchMode.ANYWHERE)); 

如果您将名字作为“abcd”传递,它会将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());

答案 2 :(得分:0)

@Rakesh尝试以下代码:

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

答案 3 :(得分:0)

'?'是JDBC语句中参数的占位符。你无法看到它的实际价值,就是这样。它没有问题,只是对休眠的跟踪仍然不完整。

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