3

次のような Hibernate クエリに問題があります。

List persons = getList("FROM creator.models.Person p WHERE p.lastName="+userName);

(このgetList(String queryString)メソッドは、セッション ファクトリを使用してクエリを実行するだけです。)

これは私の人のクラスです:

@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

そして、これはテーブルです:

CREATE TABLE persons(
    id INTEGER NOT NULL AUTO_INCREMENT,
    first_name CHAR(50),
    last_name CHAR(50),
    abbreviation CHAR(4),

    PRIMARY KEY (id)
);

TestName という名前の人を検索すると、次のメッセージで例外が発生します。

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 によって作成されたクエリは次のようになります。

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 が突然列名として表示される理由がわからないため、誰かが何が問題なのかを知っていることを願っています。

4

3 に答える 3

3

userName を引用符で囲む必要があります。

"FROM creator.models.Person p WHERE p.lastName='"+userName+"'";

または(はるかに優れています)パラメーターを使用する

于 2012-12-10T16:27:37.967 に答える
3

hql を次のように置き換えます。

    Query query = session.createQuery("from creator.models.Person p where p.lastName = ?")
       .setParameter(0, userName);
    List persons = query.list();

そうすれば、SQL インジェクションも防ぐことができます。

于 2012-12-10T16:30:44.510 に答える
2

パラメータを一重引用符で囲む必要があります。

List persons = getList("FROM creator.models.Person p WHERE p.lastName='"+userName+"'");

ただし、パラメーター化されたクエリを使用すると、はるかに優れています。

        String hql = "FROM creator.models.Person p WHERE p.lastName= :userName";
        Query query = session.createQuery(hql);
        query.setString("userName",userName);
        List results = query.list();
于 2012-12-10T16:27:53.490 に答える