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

Hibernate条件API在没有任何关联的情况下加入实体

岳彬炳
2023-03-14

我正在尝试编写一个相当于以下SQL查询的Hibernate Criteria API:

select c.NAME         as carName,
   cc.COLOR_CODE      as colorCode,
   cc.COLOR           as color,
   c.DESCRIPTION      as desc,
   c.MANUFACTURE_YEAR as year
from CAR c
     LEFT JOIN CAR_COLOR CC on c.COLOR_CODE_ID = CC.ID
WHERE CC.COLOR_CODE = ?

这是我的car实体

public class Car extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @Basic
    @Column(name = "MANUFACTURE_YEAR")
    private String year;

    @Basic
    @Column(name = "DESCRIPTION")
    private String desc;
    private Long colorCodeId;
    private String manufacturer;
}

这是我的carcolor实体

public class CarColor extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String color;
    private String colorCode;
}

Car.ColorCodeID是引用CarColor.ID的外键。虽然没有明显的实体级关系,我也不能添加任何关系。

public class CarSearch {
    private String carName;
    private String colorCode;
    private String color;
    private String desc;
    private String year;
}

共有1个答案

宇文弘懿
2023-03-14

可以使用笛卡尔积

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
Root<Car> car = query.from(Car.class);
Root<CarColor> carColor = query.from(CarColor.class);

Predicate joinPredicate = cb.equal(car.get("colorCodeId"), carColor.get("id"));

query.multiselect(
    car.get("name"),
    carColor.get("colorCode"),
    carColor.get("color"),
    car.get("desc"),
    car.get("year")
).where(
    joinPredicate, 
    cb.equal(carColor.get("colorCode"), "yourColorCode")
);

若要避免查询结果中出现Object[],应使用适当的构造函数创建QueryResultDTo类,并以以下方式使用

CriteriaQuery<QueryResultDto> query = cb.createQuery(QueryResultDto.class);
//...
query.select(cb.construct(QueryResultDto.class, 
    car.get("name"),
    carColor.get("colorCode"),
    carColor.get("color"),
    car.get("desc"),
    car.get("year")
));
 类似资料:
  • 问题内容: 示例问题: 实体: 用户包含姓名和朋友列表(用户参考) 博客文章包含标题,内容,日期和作者(用户) 需求: 我想要一个显示标题的页面以及指向用户朋友的最近10篇博客的链接。我还希望能够通过较旧的条目继续进行分页。 SQL解决方案: 因此在sql land中,它将类似于: 我能想到的GAE解决方案是: 加载用户,循环浏览好友列表并加载其最新博客帖子。最后合并所有博客文章以查找最新的10个

  • 问题内容: 我想使用Hibernate的条件api来制定连接两个实体的特定查询。假设我有两个实体,Pet和Owner,拥有者拥有很多宠物,但是关键是关联没有映射到Java批注或xml中。 使用hql,我可以通过在查询中指定联接来选择拥有“ fido”宠物的所有者(而不是将一组宠物添加到owner类)。 可以使用hibernate条件进行相同的操作吗?如果可以,怎么办? 谢谢,J 问题答案: 我的理

  • 本文向大家介绍如何在没有ON条件的情况下使用MySQL JOIN?,包括了如何在没有ON条件的情况下使用MySQL JOIN?的使用技巧和注意事项,需要的朋友参考一下 我们可以不加条件地使用“交叉连接”。交叉联接以笛卡尔积形式给出结果。例如,如果一个表中有3条记录,而另一个表中有2条记录,则第一个记录将与所有第二个表记录匹配。然后,将重复相同的过程以进行第二次记录,依此类推。 交叉连接的例子 创建

  • 问题内容: 我想无条件删除表中的前500条记录。 表定义如下: 我这里没有任何主键。我尝试删除使用 但是它抛出错误: 错误:“ LIMIT”处或附近的语法错误第1行:从TXN_LOG LIMIT 5000中删除^ * 错误 * 错误:语法错误在“ LIMIT”或附近 有人可以建议我这样做吗? 问题答案: 尝试如下准备子查询

  • 我有以下2个实体: 它们有共享字段/列,例如:等,但是每个主键id字段的名称不同,例如有和 有没有一种方法可以创建一个基本实体超类来保存这些通用的