首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate "where“查询只对id字段有效

hibernate "where“查询只对id字段有效
EN

Stack Overflow用户
提问于 2012-12-11 00:25:01
回答 3查看 5.1K关注 0票数 3

我有一个Hibernate查询的问题,如下所示:

代码语言:javascript
复制
List persons = getList("FROM creator.models.Person p WHERE p.lastName="+userName);

( getList(String queryString)方法只使用会话工厂执行查询。)

这是我的person类:

代码语言:javascript
复制
@Entity
@Table(name="persons")
public class Person{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Long        id;

    @Column(name="first_name", nullable=false, updatable=true)
    private String firstName;

    @Column(name="last_name", nullable=false, updatable=true)
    private String lastName;
    /// etc

这是表格:

代码语言:javascript
复制
CREATE TABLE persons(
    id INTEGER NOT NULL AUTO_INCREMENT,
    first_name CHAR(50),
    last_name CHAR(50),
    abbreviation CHAR(4),

    PRIMARY KEY (id)
);

搜索一个名为TestName的人,我得到了一个异常,消息如下:

代码语言:javascript
复制
org.hibernate.exception.SQLGrammarException: Unknown column 'TestName' in 'where clause'
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
//etc

Hibernate创建的查询如下所示:

代码语言:javascript
复制
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select person0_.id as id8_, person0_.abbreviation as abbrevia2_8_, person0_.first_name as first3_8_, person0_.last_name as last4_8_ from persons person0_ where person0_.last_name=TestName
Dec 10, 2012 5:14:26 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

顺便说一下,搜索id (...WHERE p.id="3")可以很好地工作!

我希望有人知道哪里出了问题,因为对我来说,查询看起来是正确的,并且我找不到为什么lastName突然被视为列名。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-11 00:27:53

您需要用单引号将参数括起来:

代码语言:javascript
复制
List persons = getList("FROM creator.models.Person p WHERE p.lastName='"+userName+"'");

但是使用参数化查询要好得多:

代码语言:javascript
复制
        String hql = "FROM creator.models.Person p WHERE p.lastName= :userName";
        Query query = session.createQuery(hql);
        query.setString("userName",userName);
        List results = query.list();
票数 2
EN

Stack Overflow用户

发布于 2012-12-11 00:27:38

您需要将userName放在引号中:

代码语言:javascript
复制
"FROM creator.models.Person p WHERE p.lastName='"+userName+"'";

或者(哪个更好)来使用参数

票数 3
EN

Stack Overflow用户

发布于 2012-12-11 00:30:45

将您的hql替换为:

代码语言:javascript
复制
    Query query = session.createQuery("from creator.models.Person p where p.lastName = ?")
       .setParameter(0, userName);
    List persons = query.list();

这样还可以防止sql注入。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13804940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档