【问题标题】:java hibernate Unknown column ' ' in 'field list''字段列表'中的java休眠未知列''
【发布时间】:2013-02-10 13:16:06
【问题描述】:

我需要帮助。

当我使用 getAllStreets() 方法时,我在 HQL 中出现错误:

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

我猜他必须写this_1_id而不是this_1_.houses_id

可能是我做错了实体和关系?

2 个实体 - 房屋和街道

ER - 型号:

桌街

  • 身份证
  • 姓名
  • Houses_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 系统。 休眠:选择this_.id 作为id1_1_,this_.houses_id 作为houses2_1_1_,this_.name 作为name1_1_,this_1_.houses_id 作为houses3_0_1_,house2_.id 作为id0_0_,house2_.name 作为name0_0_ 从Streets this_left outer join Houses this_1_ on this_.id =this_1_.id 在 this_1_.houses_id=house2_.id 上左外连接 Houses house2_ 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” 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 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(Native Method) 在 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 更多

【问题讨论】:

  • 啊啊啊!代码太多!!!
  • 为什么你的街道对象中同时拥有房屋 ID 和房屋?
  • 您是否尝试过直接运行此查询? Streets 表是否有 houses_id 列?
  • 如果你放注释,确保没有空格
  • 您应该先调试您的 sql 查询,如果它运行正常,则问题出在 java 代码中。但现在看来您的查询首先不正确

标签: java hibernate


【解决方案1】:

请确保您调用的表具有正确的列。我遇到了问题,我发现映射的域列在数据库中不匹配。

【讨论】:

  • 以类似的方式,我发现 MySQL Workbench 中的列名有多余的前导空格 - 不确定它们是如何到达那里的,但一旦删除,错误就解决了。我使用 Table Inspector 看到了空格。
  • 要扩展评论 - 还要检查您的绑定字段是否与数据库中的名称相同。您可能会认为您正在使用某种命名策略在蛇形和骆驼形之间进行转换,但事实并非如此。
【解决方案2】:

查看这段代码:

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

我不确定你想在这里实现什么,但JoinTable 通常用于解决与中间表的多对多关系。所以这段代码意味着你有表Housesidhouses_id 列。错误消息说Houses 表中没有houses_id(这对我来说听起来合乎逻辑)
也许您应该尝试 ManyToOne 和 JoinColumn 代替?例如:

@JoinColumn(name="house_id")

houses_id,如果这是您在街道表中的外键。如果这真的是多对一关系,复数听起来很奇怪。

【讨论】:

  • 是的,你是对的!我删除了某人的悲伤并写道:@ManyToOne @JoinColumn(name="houses_id") public House getHouse() { return house; } public void setHouse(House house) { this.house = house; } 和它的工作..现在我需要与房子测试房地产。
【解决方案3】:

我注意到,虽然我使用了 userName 或 bloodGroup 之类的变量名,但它收到错误“Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'user0_.blood_group' in 'field list'” 要克服此问题,请更改变量名称,例如 username 或 blood_Group。我希望它能得到例外的结果。

【讨论】:

  • 我没想到它会起作用,但它确实起作用了(我在“字段列表”中遇到了未知列“appointmen0_.apptDesc”)。谁能澄清为什么这是一个解决方案,以及为什么当驼峰案例与数据库匹配时它不允许标准驼峰案例?
【解决方案4】:

还要检查你的类上的 getter 和 setter 名称,都必须相同

    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:插入 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] 错误 o.h.e.jdbc.spi.SqlExceptionHelper -“字段列表”中的未知列“survey_SurveyID”

    请注意,survey_SurveyID 已通过我在调查表上所做的映射添加。不知道为什么只是进行提取将此列添加到本应独立的 UserSurvey 日志中的插入中。

    我解决这个问题的方法是在@join 列上添加一个 insertable=false, updatable = false。

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

    【讨论】:

      【解决方案6】:

      只需检查 POJO 中的变量名称和数据库中提供的名称。当它们不相同时,将引发此错误。

      【讨论】:

      • 这应该是一条评论。不是问题的答案。添加一些描述并解释更多细节。
      【解决方案7】:

      请检查您的数据库是否有所有表。如果表中缺少任何表或属性,请将它们添加到您的数据库并重新添加您的休眠映射文件。我以这种方式修复了这个错误。我的数据库的两个表中缺少 2 个属性,添加它们并重新添加休眠后,错误已修复。

      【讨论】:

        猜你喜欢
        • 2016-10-07
        • 2014-03-19
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多