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 - модель:
Улицы таблицы
Настольные дома
Мои классы:
Улица
@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, ошибка была исправлена.