【问题标题】:JPQL join 2 tables: Writing jpqlJPQL 连接 2 个表:编写 jpql
【发布时间】:2012-05-20 16:29:41
【问题描述】:

我有 2 张桌子 第一桌 - 活动 第二个表 - 类别

@Entity
public class Event {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long eventId;
private String name;
@ManyToOne
@JoinColumn(name = "category_id")
private EventCategory category;
//getters and setters
}

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "CATEGORY" }))
public class EventCategory {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long categoryId;
@NotNull
private String category;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
private List<Event> events;
}

现在我想要所有类别具有某种价值的事件。我对 jpa 很陌生。很难为此编写查询。如果你能帮助我,那将是有帮助的。

编辑:我将 categoryId 存储在事件表中。我希望能够按类别名称搜索。类别名称仅保存在类别表中。所以我想我需要加入类别表。

【问题讨论】:

  • 是的,以某种方式找到类别(EntityManager.find(Object Id)?)并获取类别。 ?
  • 正如我在之前的评论中提到的,我将 categoryId 存储在事件表中。我希望能够按类别名称搜索。类别名称仅保存在类别表中。所以我想我需要将事件表与类别表连接起来。
  • 这是您第一次提到要按类别搜索名称
  • 很抱歉。我已将其添加到以下回复之一的评论中。我已经相应地编辑了我的主要帖子。

标签: java sql hibernate jpa jpql


【解决方案1】:

使用这样的查询:

final String query = "SELECT e FROM Event e WHERE e.category = :category";

您可以通过多种方式检索记录,但这里有一种:

final EventCategory category = ...;
TypedQuery<Event> query = entityManager.createQuery(query, Event.class);
query.setParameter("category", category);
final List<Event> events = query.getResultList();

* 编辑 *

默认情况下,我上面说明的方法将根据为您的类别对象定义的主键进行搜索。如果您想按其他属性进行搜索,则需要在 JPQL 中指定:

final String query = "SELECT e FROM Event e WHERE e.category.name = :categoryName";

final String categoryName = ...;
TypedQuery<Event> query = entityManager.createQuery(query, Event.class);
query.setParameter("categoryName", categoryName);
final List<Event> events = query.getResultList();

【讨论】:

  • 不确定这是否可行。我将 categoryId 存储在事件表中。我希望能够按类别名称搜索。类别名称仅保存在类别表中。所以我想我需要加入类别表。
  • @CRS - 你需要编辑你的原始问题然后再提及。见编辑。
  • @Perception 使用您的查询需要一个已经拥有 EventCategory -> 我们已经拥有 EventCategory 中的事件,如 category.getEvents() ...
  • @esej - 不,它没有。您可以仅使用要搜索的条件手动创建事件类别,并将其作为参数传递给查询。
  • 是的,您是对的,感谢您向我指出这一点。我仍然认为查询应该查询类别而不是事件 - 但我想这是一个完全不同的故事。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2012-11-09
  • 2018-07-06
  • 1970-01-01
  • 2016-01-22
  • 2016-05-13
  • 2014-11-22
相关资源
最近更新 更多