19

助けが必要です。

メソッドを使用getAllStreets()すると、HQL でエラーが発生します。

org.hibernate.exception.SQLGrammarException: Unknown column 'this_1_.houses_id' in 'field list'

私は彼がthis_1_id代わりに書く必要があると思いますthis_1_.houses_id

私は間違ったエンティティと関係をしたのでしょうか?

2 エンティティ - 家屋と街路

小胞体 - モデル:

テーブルストリート

  • ID
  • 名前
  • Houses_id

テーブルハウス

  • ID
  • 名前

私のクラス:

@Entity
@Table(name="Streets")
public class Street {
    private Long id;
    private String name;
    private Long houses_id;
    private House house;
    public Street(){}    
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy="increment")
    @Column(name="id")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @ManyToOne
    @JoinTable(name="Houses", joinColumns = @JoinColumn(name="id"), inverseJoinColumns=@JoinColumn(name="houses_id"))
    public House getHouse() {
        return house;
    }
    public void setHouse(House house) {
        this.house = house;
    }
    @Column(name="houses_id")
    public Long getHouses_id() {
        return houses_id;
    }
    public void setHouses_id(Long houses_id) {
        this.houses_id = houses_id;
    }
}

@Entity
@Table(name="Houses")
public class House {

    private Long id;
    private String name;
    public House(){}

    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name="increment", strategy="increment")
    @Column(name="id")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

私のDAOIMP:

StreetDAOImp:

public class StreetDAOImpl implements StreetDAO {
    @Override
    public void addStreet(Street street) throws SQLException {
        // TODO Auto-generated method stub
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();

            session.save(street);
            session.getTransaction().commit();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        finally{
            if(session != null && session.isOpen()){
                session.close();
            }
        }
    }
    @Override
    public Collection getAllStreets() throws SQLException {
        // TODO Auto-generated method stub
        Session session = null;
        List<Street> streets = new ArrayList<Street>(); 
        try {
            session = HibernateUtil.getSessionFactory().openSession();

            streets = session.createCriteria(Street.class).list();
            //Query q = session.createQuery("select str from com.ff.model.Street str join str.houses h where h.id = str.houses_id");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return streets;
    }
}

HouseDAOImpl:

public class HouseDAOImpl implements HouseDAO {

    @Override
    public void addHouse(House house)throws SQLException {
        // TODO Auto-generated method stub
        Session session = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(house);
            session.getTransaction().commit();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        finally{
            if(session != null && session.isOpen()){
                session.close();
            }
        }
    }

    @Override
    public Collection getAllHouses() throws SQLException {
        // TODO Auto-generated method stub
        Session session = null;
        List<House> houses = new ArrayList<House>();

        try {
            session = HibernateUtil.getSessionFactory().openSession();
            houses = session.createCriteria(House.class).list();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
         finally {
              if (session != null && session.isOpen()) {
                session.close();
              }

    }
    return houses;
}}

エラー:

log4j:WARN ロガー (org.jboss.logging) のアペンダーが見つかりませんでした。
log4j:WARN log4j システムを適切に初期化してください。
Hibernate: id1_1_ として this_.id、houses2_1_1_ として this_.houses_id、name1_1_ として this_.name、houses3_0_1_ として this_1_.houses_id、id0_0_ として house2_.id、name0_0_ として house2_.name を選択します。 =this_1_.id 左外部ジョインハウス house2_ on this_1_.houses_id=house2_.id
org.hibernate.exception.SQLGrammarException: 「フィールド リスト」の列「this_1_.houses_id」が不明です
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert (SQLExceptionTypeDelegate.java:82) で
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter.java:49) で
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:125) で
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:110) で
    org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation (AbstractStatementProxyHandler.java:129) で
    org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke (AbstractProxyHandler.java:81) で
    $Proxy14.executeQuery (不明なソース) で
    org.hibernate.loader.Loader.getResultSet(Loader.java:2031) で
    org.hibernate.loader.Loader.executeQueryStatement (Loader.java:1832) で
    org.hibernate.loader.Loader.executeQueryStatement (Loader.java:1811) で
    org.hibernate.loader.Loader.doQuery (Loader.java:899) で
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:341) で
    org.hibernate.loader.Loader.doList (Loader.java:2516) で
    org.hibernate.loader.Loader.doList (Loader.java:2502) で
    org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2332) で
    org.hibernate.loader.Loader.list (Loader.java:2327) で
    org.hibernate.loader.criteria.CriteriaLoader.list (CriteriaLoader.java:124) で
    org.hibernate.internal.SessionImpl.list (SessionImpl.java:1621) で
    org.hibernate.internal.CriteriaImpl.list (CriteriaImpl.java:374) で
    com.ff.DAO.StreetDAOImpl.getAllStreets (StreetDAOImpl.java:48) で
    FFMain.main(FFMain.java:58)
原因: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 不明な列 'this_1_.houses_id' in 'field list'
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(ネイティブメソッド)
    sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:39) で
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) で
    java.lang.reflect.Constructor.newInstance (Constructor.java:513) で
    com.mysql.jdbc.Util.handleNewInstance (Util.java:406) で
    com.mysql.jdbc.Util.getInstance (Util.java:381) で
    com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1030) で
    com.mysql.jdbc.SQLError.createSQLException (SQLError.java:956) で
    com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3491) で
    com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3423) で
    com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1936) で
    com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2060) で
    com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2542) で
    com.mysql.jdbc.PreparedStatement.executeInternal (PreparedStatement.java:1734) で
    com.mysql.jdbc.PreparedStatement.executeQuery (PreparedStatement.java:1885) で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で
    java.lang.reflect.Method.invoke(Method.java:597) で
    org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation (AbstractStatementProxyHandler.java:122) で
    ... 16以上
4

7 に答える 7

9

呼び出しているテーブルに正しい列があることを確認してください。問題があり、マップされたドメイン列がデータベースで一致していないことがわかりました。

于 2013-12-29T02:20:29.210 に答える
5

このコードをチェックしてください:

@JoinTable(name="Houses", joinColumns = @JoinColumn(name="id"), inverseJoinColumns=@JoinColumn(name="houses_id"))

ここで何を達成しようとしているのかわかりませんが、JoinTableは通常、中間テーブルとの ManyToMany 関係を解決するために使用されます。したがって、このコードは、および列を持つテーブルがあることを意味Housesidますhouses_idhouses_idエラーメッセージはHousesテーブルにないということです(これは私には論理的に聞こえます)
代わりにManyToOneとJoinColumnを試してみてください。例えば:

@JoinColumn(name="house_id")

またはhouses_id、それがストリートテーブルの外部キーである場合。これが本当に多対 1 の関係である場合、複数形は奇妙に聞こえます。

于 2013-02-25T12:19:19.987 に答える
1

userName や BloodGroup などの変数名を使用しているときに、「Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'user0_.blood_group' in 'field list'」というエラーが表示されることに気付きました。この問題を克服するには、変数名を変更してください。ユーザー名やblood_Groupなど。例外的な結果が得られることを願っています。

于 2020-08-05T10:48:01.777 に答える
0

私は受け入れられた答えがあることを知っています。このページに同じ問題を抱えている人に別の回答を述べたいと思います-フィールドリストの不明な列。

マッピングを介して UserSurveyLog (両方のテーブル間で共通の SurveyID を持つ) をクエリするときに、(Survey Table から) Survey の詳細を取得しようとしていました。

UserSurvey テーブルでのマッピング

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(referencedColumnName = "SurveyID")
private Survey survey;

public Survey getSurvey() {    return survey;  }

public void setSurvey(Survey survey) {   this.survey = survey;  }

public Integer getUserSurveyLogID() {
    return userSurveyLogID;
}

私が受け取ったこのエラーを見てください

Hibernate: hifiniteDB.UserSurveyLog (CompletedDate、CreatedByUserName、CreatedDate、ExpiryDate、LastDeliveredDate、ModifiedByUserName、ModifiedDate、OrgNodeID、ProgramUserID、RootOrgNodeID、survey_SurveyID、SurveyID、SurveyStatus、SurveyTriggerID、SurveyTriggerType、UserDiagnosisID、UserID) 値 (?、?、?、 ?、?、?、?、?、?、?、?、?、?、?、?、?、?) 2019-10-09 14:39:45.722 [https-jsse-nio-8443-exec-3 ] エラー ohejdbc.spi.SqlExceptionHelper - 「フィールド リスト」の不明な列「survey_SurveyID」

Survey テーブルで作成したマッピングによって、survey_SurveyID が追加されていることを確認します。フェッチを実行するだけで、独立しているはずの UserSurvey ログの挿入にこの列が追加される理由がわかりません。

これを解決する方法は、 @join 列に insertable=false, updatetable = false を追加することでした。

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(referencedColumnName = "SurveyID", insertable = false,updatable = false)
private Survey survey;
于 2019-10-09T09:56:30.443 に答える
-1

POJO の変数名とデータベースで提供されている名前を確認するだけです。それらが同じでない場合、このエラーがスローされます。

于 2016-04-09T05:14:31.680 に答える