当前位置: 首页 > 知识库问答 >
问题:

如何用Hibernate条件查询选择下级实体?

富辰阳
2023-03-14

假设我有一个名为HQL(findRoomQuery)的文件:

select r from House h inner join h.roomList r
where h.address = :address and r.roomNo = :roomNo

House实体的映射如下:

<class name="com.example.House" table="house">      
    <id name="id" column="id" type="long">
        <generator class="assigned" />
    </id>

    <property name="address" column="address" type="string" length="100" not-null="false"/>
    <set name="roomList" cascade="none" lazy="false" fetch="join" inverse="true"> 
        <key>
            <column name="house_id"/>
        </key>
        <one-to-many class="com.example.Room"/>
    </set>
</class>

虽然Room实体是这样的:

<class name="com.example.Room" table="room">        
    <id name="id" column="id" type="long">
        <generator class="assigned" />
    </id>

    <property name="houseId" column="house_id" type="long" not-null="true"/>
    <property name="roomNo" column="room_no" type="string" length="4" not-null="false"/>
</class>

这种关系是一个房子可以有一个或多个房间。

执行查询的代码如下:

Query query = getSession().createQuery("findRoomQuery")
                .setParameter("address", address)
                .setParameter("roomNo", roomNo);
return query.list();

您可以从选择r(r是h.room列表的别名)中看到HQL返回房间实体。

如何使用Hibernate条件查询做同样的事情?可能吗?

共有1个答案

宋健柏
2023-03-14

试试这个

 Criteria criteria = session.createCriteria(House.class, "house"); 
              criteria.createAlias("house.roomList", "roomList");           
              criteria.add(Restrictions.eq("house.address",address));              
              criteria.add(Restrictions.eq("roomList.roomNo", roomNo)); 
              criteria.setProjection(Projections.property("roomList"));

           Room  r =  (Room) criteria.uniqueResult();

取代

 <property name="houseId" column="house_id" type="long" not-null="true"/>

 <many-to-one name="houseId" class="com.example.House" fetch="select">
            <column name="house_id" not-null="true" />
 </many-to-one>
 类似资料:
  • 问题内容: 我是Hibernate和Criteria Query的新手。所以我在HQL中实现了查询: 如何使用hibernate条件对象实现它? 问题答案: 您的示例只是本机SQL,而不是HQL。无论如何,您可以使用Criteria API中的以下方法来构造所需的Criteria对象: 使用setProjection(Projection projection)定义select子句 使用creat

  • 其中“in”是来自用户的输入。 我只从hibernate中的两个表中映射了Emp_Id作为主键,因此hibernate条件将只对该表应用联接,而不对Langcode应用联接。 注意:-我不能更改hibernate映射,只能使用hibernate标准,根据客户的要求,请帮助我。

  • JPA Criteria似乎坚持认为min()(和max())只适用于数字字段。然而,情况并非如此,因为SQL数据库确实可以从字符串列中选择min()和max()值。我还可以使用JQL选择字符串列的min()或max()值。 但是,当使用条件查询时,编译器会在 min() 与字符串列一起使用时进行报错:绑定不匹配:条件生成器类型的泛型方法 min(表达式)不适用于参数(子查询.get(“strin

  • 我试图使用JPA标准编写以下查询,但我无法选择子查询中的多列。 我陷入了下面的实现过程中,无法找到如何在子查询中选择多个列。请看我在代码中的评论(第三行)。 请帮我解决这个问题。

  • 我正在寻找一种方法,使用带有元模型的jpa criteria查询API来选择父实体的所有子实体。 表族 } 表家庭成员 现在,我想在选择family时选择family的所有子实体,而不是使用更慢的方法来获取所有family的列表,循环列表并填充family member list。 为了实现这个结果qith平原SQL,我写这样一个查询: 现在我的问题是,如何将本机查询转换为criteria API