Java hibernate Неизвестный столбец '' в 'списке полей'

Мне нужна помощь.

Когда я использую метод getAllStreets(), у меня есть ошибка в HQL:

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

Думаю, он должен написать this_1_id вместо this_1_.houses_id

Может быть, я сделал неправду Сущность и отношение?

2 объекта - Дома и улицы

ER - модель:

Улицы таблицы

  • 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"), [email protected](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 No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select this_.id as id1_1_, this_.houses_id as houses2_1_1_, this_.name as name1_1_, this_1_.houses_id as houses3_0_1_, house2_.id as id0_0_, house2_.name as name0_0_ from Streets this_ left outer join Houses this_1_ on this_.id=this_1_.id left outer join Houses house2_ on this_1_.houses_id=house2_.id
org.hibernate.exception.SQLGrammarException: Unknown column 'this_1_.houses_id' in 'field list'
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at $Proxy14.executeQuery(Unknown Source)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2031)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
    at org.hibernate.loader.Loader.doQuery(Loader.java:899)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    at org.hibernate.loader.Loader.doList(Loader.java:2516)
    at org.hibernate.loader.Loader.doList(Loader.java:2502)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
    at org.hibernate.loader.Loader.list(Loader.java:2327)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1621)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
    at com.ff.DAO.StreetDAOImpl.getAllStreets(StreetDAOImpl.java:48)
    at FFMain.main(FFMain.java:58)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'this_1_.houses_id' in 'field list'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    ... 16 more

Ответ 1

Проверьте этот код:

@JoinTable(name="Houses", joinColumns = @JoinColumn(name="id"), [email protected](name="houses_id"))

Я не уверен, чего вы пытаетесь достичь здесь, но JoinTable обычно используется для разрешения отношений ManyToMany с таблицей промежуточных. Таким образом, этот код означает, что у вас есть таблица Houses с столбцами id и houses_id. В сообщении об ошибке говорится, что нет таблицы houses_id in Houses (что звучит логично для меня)
Возможно, вам стоит попробовать ManyToOne и JoinColumn? Например:

@JoinColumn(name="house_id")

или houses_id, если ваш внешний ключ в таблице улиц. Множественное звучит странно, если это действительно много-к-одному.

Ответ 2

Пожалуйста, убедитесь, что таблица, которую вы вызываете, имеет правильные столбцы. У меня была проблема, и я обнаружил, что сопоставленные столбцы домена не совпадают в базе данных.

Ответ 3

У меня тоже такое же исключение, но, чтобы исправить это, я просмотрел свою базу данных, чтобы проверить, хороши ли мои отношения (я имею в виду то же самое, что и для их сопоставления), в заключение я обращаю обратное отношение и работал !!! Надежда помогает кому-то так небрежно, как я! : D

Ответ 4

проверьте также имена получателей и установщиков в вашем классе, все должны быть одинаковыми

    public String getNome() {//wrong Nome
        return name;
    }


    public void getName(String name) {//right
        this.name = name;
    }

Ответ 5

Я знаю, что есть принятый ответ. Я хотел бы упомянуть альтернативный ответ для всех, кто приходит на эту страницу с той же проблемой - неизвестный столбец в списке полей.

Я пытался получить сведения об опросе (из таблицы опросов), когда я запрашиваю UserSurveyLog (который имеет общий SurveyID для обеих таблиц) с помощью сопоставления

Отображение в таблице 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: insert into hifiniteDB.UserSurveyLog(CompletedDate, CreatedByUserName, CreatedDate, ExpiryDate, LastDeliveredDate, ModifiedByUserName, ModifiedDate, OrgNodeID, ProgramUserID, RootOrgNodeID, survey_SurveyID, SurveyID, SurveyStatus, SurveyTriggerID, SurveyTriggerType, UserDiagnosisID, UserID) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 2019-10-09 14:39:45.722 [https-jsse-nio-8443-exec-3] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Unknown column 'survey_SurveyID' in 'field list'

Обратите внимание, что survey_SurveyID был добавлен в соответствии с отображением, которое я сделал в таблице опросов. Не знаю, почему простая выборка добавляет этот столбец в журнал вставки в журнал UserSurvey, который должен был быть независимым.

Я решил это, добавив вставляемый = false, Updatable = false в столбец @join.

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

Ответ 6

Просто проверьте имена переменных в POJO и имена, указанные в базе данных. Когда они не совпадают, эта ошибка возникает.

Ответ 7

Пожалуйста, проверьте, есть ли в вашей базе данных все таблицы. Если в таблице отсутствуют какие-либо таблицы или атрибуты, добавьте их в свою базу данных и повторно добавьте файлы сопоставления спящего режима. Я исправил эту ошибку таким образом. Я потерял 2 атрибута в двух таблицах моей базы данных, и как только я добавил их и снова добавил hibernate, ошибка была исправлена.