【问题标题】:Criteria - where clause on joined table条件 - 连接表上的 where 子句
【发布时间】:2015-10-30 02:23:58
【问题描述】:

我在 MySQL 数据库中有两个表:COURSE 和 COURSE_SESSION。

COURSE 有两个字段:代码(主键)和标题。

CourseSession 有一个名为 course_code 的字段,它是链接到 Course 元素的外键。

我想做这样的事情,但使用 Java 中的 Criteria API:

SELECT * FROM COURSE_SESSION 加入课程
WHERE course_code = code AND title like "%substring%";

两个表都用hibernate正确映射。

我试过了:

Criteria criter = s.createCriteria(CourseSession.class);
        criter.add(Restrictions.like("courseCode.title", "%substring%"));

但我最终得到一个错误:

HTTP 500 - 无法解析属性: courseCode.title of: org.xxx.core.entity.CourseSession

消息无法解析属性: courseCode.title of: org.xxx.core.entity.CourseSession

例外

org.hibernate.QueryException:无法解析属性:courseCode.title of:fr.utbm.lo54.core.entity.CourseSession
    org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
    org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:96)
    org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62)
    org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1443)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:483)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:443)
    org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:68)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:380)
    org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:114)
    org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:83)
    org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:92)
    org.hibernate.impl.SessionImpl.list(SessionImpl.java:1687)
    org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
    fr.utbm.lo54.core.servlet.SearchData.doGet(SearchData.java:52)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

奇怪的是,如果我使用Restrictions.like("courseCode.code", "%substring%") 对 courseCode.code 进行限制,它可以正常工作。

编辑

课程.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.xxx.core.entity">
    <class name="Course" table="COURSE">
        <id name="code" column="CODE">
            <generator class ="identity"/>
        </id>
    <property name="title" column="TITLE" not-null="true"/>
    </class>
</hibernate-mapping>

CourseSession.hbm.xml:

<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.xxx.core.entity">
    <class name="CourseSession" table="COURSE_SESSION">
        <id name="id" column="ID">
            <generator class="identity" />
        </id>

        <property name="startDate" column="START_DATE" not-null="true" />
        <property name="endDate" column="END_DATE" not-null="true" />
        <many-to-one name="courseCode" column="COURSE_CODE" />
        <many-to-one name="locationId" column="LOCATION_ID" />
    </class>
</hibernate-mapping>

【问题讨论】:

  • 两个表都用hibernate正确映射:怎么样?这很重要,因为 Criteria 查询使用来自实体的字段和关联。向我们展示他们的代码。

标签: java hibernate-criteria


【解决方案1】:

首先为该字段创建一个别名以实现此目的。

试试下面的代码,应该会有帮助

criter.createAlias("courseCode","courseCode");//course code is the association variable in your pojo class.

【讨论】:

  • 谢谢,它正在工作!您能否再解释一下为什么需要这样做以及为什么 courseCode.code 之前有效?
  • 发生这种情况是因为每当我们的类中有关系时,我们需要为它们设置一个别名,通过该别名可以调用相关字段。由于别名不存在,休眠无法确定对象之间的关系。
猜你喜欢
  • 2017-06-28
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多