代码之家  ›  专栏  ›  技术社区  ›  sofs1 Romain Manni-Bucau

2个POJO类扩展了一个基类,其中每个类映射到唯一的表。为什么Hibernate查询在字段列表错误中创建未知列“”?

  •  1
  • sofs1 Romain Manni-Bucau  · 技术社区  · 6 年前

    问题.java

    @Entity
    @Table(name="question")
    @Access(value = AccessType.FIELD)
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class Questions{
    
        private static final long serialVersionUID = 1L;
    
        private String qid;
    
        @Column(name="addedtime")
        private String addedtime;
    
        @Column(name="qlang")
        private String qlang;
    
        @Id
        @Column(name="qid")
        @GeneratedValue(generator = "uuid2")
        @GenericGenerator(name = "uuid2", strategy = "uuid2")
        @Access(value = AccessType.PROPERTY)
        public String getQid() {
            return qid;
        }
    
        public void setQid(String qid) {
            this.qid = qid;
        }
    
        @Access(value = AccessType.PROPERTY)
        public String getAddedtime() {
            return addedtime;
        }
    
        public void setAddedtime(String addedtime) {
            this.addedtime = addedtime;
        }
    
        @Access(value = AccessType.PROPERTY)
        public String getQlang() {
           return qlang;
        }
    
        public void setQlang(String qlang) {
           this.qlang = qlang;
        }
    }
    

    @Entity
    @Table(name="MCQ")
    @Access(value = AccessType.FIELD)
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class MCQ extends Questions implements Serializable{
    
        @Column(name="option_1")
        @Access(value = AccessType.FIELD)
        private String option_1;
    
        @Access(value = AccessType.PROPERTY)
        public String getOption_1() {
            return option_1;
        }
    
        public void setOption_1(String option_1) {
            this.option_1 = option_1;
        }
    
        @Column(name="option_2")
        @Access(value = AccessType.FIELD)
        private String option_2;
    
        @Access(value = AccessType.PROPERTY)
        public String getOption_2() {
            return option_2;
        }
    
        public void setOption_2(String option_2) {
            this.option_2 = option_2;
        }
    
    }
    

    @Entity
    @Table(name="TwoMarkQ")
    @Access(value = AccessType.FIELD)
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public class TwoMarkQ extends Questions implements Serializable{
    
        @Column(name="option_1")
        @Access(value = AccessType.FIELD)
        private String option_1;
    
        @Access(value = AccessType.PROPERTY)
        public String getOption_1() {
            return option_1;
        }
    
        public void setOption_1(String option_1) {
            this.option_1 = option_1;
        }
    
        @Column(name="option_2")
        @Access(value = AccessType.FIELD)
        private String option_2;
    
        @Access(value = AccessType.PROPERTY)
        public String getOption_2() {
            return option_2;
        }
    
        public void setOption_2(String option_2) {
            this.option_2 = option_2;
        }
    
    }
    

    create table `question` (
      `qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
      `addedtime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
      `qtype` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `qlang` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
       PRIMARY KEY (`qid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    
    create table `MCQ`(
    `qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
    `option_1` bigint(20) DEGAULT `0`,
    `option_2` bigint(20) DEGAULT `0`,
    PRIMARY KEY (`qid`),
    CONSTRAINT `mcq_ibfk1` FOREIGN KEY (`qid`) REFERENCES `question` (`qid`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    
    create table `TwoMarkQ`(
    `qid` varchar(48) COLLATE utf8mb4_unicode_ci NOT NULL,
    `option_1` bigint(20) DEGAULT `0`,
    `option_2` bigint(20) DEGAULT `0`,
    PRIMARY KEY (`qid`),
    CONSTRAINT `two_markq_ibfk1` FOREIGN KEY (`qid`) REFERENCES `question` (`qid`)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    

    Query query = session.createQuery("select q.qid, q.qtype from Questions q where q.qlang=:lang ORDER BY q.addedtime ASC");
                query.setParameter("lang", lang);
                query.setFirstResult(startingRow).setMaxResults(10);
                result = (List<Questions>) query.list(); 
    

    result = (List<Questions>) query.list();

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'addedtime' in 'field list'

    请帮忙。在这上面打了3天。

    PS:这是生成的查询

    select questions0_.qid as col_0_0_, questions0_.qtype as col_1_0_ from ( select qid, addedtime, qlang, qtype, null as option_1, null as option_2 as class_ from MCQ union  select qid, addedtime, qlang, qtype, null as option_!, null as option_2 as class_ from TwoMarkQ)  questions0_ where questions0_.qlang=? order by questions0_.addedtime ASC limit ?
    

    Query query = session.createQuery("select q.qid, q.qtype from Questions q where q.qlang=:lang ORDER BY q.addedtime ASC");

    4 回复  |  直到 6 年前
        1
  •  0
  •   vincent    6 年前

    键入从服务器获取数据时使用的解决方案,但数据不反映当前模型。

        2
  •  0
  •   vincent    6 年前

    //DAO Generic
    public List<T> findByCriteria(Criterion... criterion) throws DAOException {
            try {
                Criteria crit = getSession().createCriteria(getPersistentClass());
                for (Criterion c : criterion) {
                    crit.add(c);
                }
                return crit.list();
            } catch (HibernateException ex) {
                logger.error(ex.getLocalizedMessage());
                throw new DAOException(ex);
            }
        }
    
    //DAO person
        public List<Persona> findByCognome(String cognome) throws DAOException {
            try {
                Criteria criteria = getSession().createCriteria(Persona.class);
                criteria.add(Restrictions.eq("cognome", cognome).ignoreCase());
                criteria.addOrder(Order.asc("eta"));
                return criteria.list();
            } catch (DAOException ex) {
                throw new DAOException(ex.getLocalizedMessage());
            }
        }
        3
  •  0
  •   Abhay Jain    6 年前

    将继承策略更改为“已加入”。

    您可能需要为问题表中的问题类型添加一列,该列是问题类型的鉴别器列,您需要将其作为问题类的注释放置。

     @Inheritance(strategy = InheritanceType.JOINED)
     @DiscriminatorColumn(name = "QUESTION_TYPE")
     public class Questions{
     .
     .
     }
    

    @DiscriminatorValue("MCQ")
    public class MCQ extends Questions implements Serializable{
    .
    }
    

    @DiscriminatorValue("TwoMarkQ")
    public class TwoMarkQ extends Questions implements Serializable{
    .
    }
    

        4
  •  0
  •   sofs1 Romain Manni-Bucau    6 年前

    Hibernate documentation

    我们有3种选择。 InheritanceType.TABLE_PER_CLASS InheritanceType.SINGLE_TABLE InheritanceType.JOINED

    JOINED: 绝对不是我想要的。所以这是一个被排除的选择。

    SINGLE_TABLE: 
    

    我仍然有追随者

    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    @Polymorphism(type=PolymorphismType.EXPLICIT) 
    

    TABLE_PER_CLASS
    

    “使用多态查询时,需要联合来获取基类表以及所有子类表。”—因此这也是一个排除的选项。