java - 如何构建 JPA 2.0 查询

标签 java sql hibernate jpa jpa-2.0

我有两个实体:事件和评论。

@Entity
@Table(name = "events")
public class Event extends BaseEntity {
    @Id
    @Column(name = "event_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long eventId;

    @Column(name = "title", length = 200)
    protected String title;

    @OneToMany(mappedBy = "event", cascade = CascadeType.REMOVE)
    @LazyCollection(LazyCollectionOption.FALSE)
    protected List<Comment> comments;
}

@Entity
@Table(name = "comments")
public class Comment extends BaseEntity {
    @Id
    @Column(name = "comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long commentId;

    @ManyToOne(optional = false)
    @JoinColumn(name = "event_id", referencedColumnName="event_id", nullable = false)
    protected Event event;

    @Column(name = "update_time", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    protected Date updatedTimestamp;
}

因此每个事件都有一个评论列表,每个评论都有一个更新时间。

我想使用 Criteria API 构建一个查询,以便选择至少具有一条新评论的所有事件。 (新评论意味着其更新时间晚于给定日期时间)

感谢任何帮助我的人。

<小时/>

抱歉,我上面问的问题并不完整:我想要的是使用 Criteria API 构建一个查询,以便选择至少有一条新评论的所有事件并且 eventId 等于某个特定 eventId.

我已经尝试过:(给定Date lastCheckedTimeLong eventId)

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Event> cq = cb.createQuery(Event.class);
Root<Comment> c = cq.from(Comment.class);
Predicate lastCheckedTimeCondition = cb.greaterThanOrEqualTo(
     c.get(Comment_.updatedTimestamp), lastCheckedTime);
cq.where(lastCheckedTimeCondition);
cq.select(c.get(Comment_.event));
TypedQuery<Event> query = em.createQuery(cq);
result = query.getResultList();

上面的代码可以选择有新评论的事件,但现在我不知道如何添加有关eventId的条件。

最佳答案

创建事件联接,并对事件 ID 应用限制:

Join<Comment, Event> event = c.join(Comment_.event);
Predicate eventIdPredicate = cb.eq(event.get(Event_.eventId), theEventId);

然后使用 CriteriaBuilder 的 and 方法将两个谓词合并为一个,如 Lukas 的答案所示。

关于java - 如何构建 JPA 2.0 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8667662/

相关文章:

sql - 不同表的两个不同列(添加)的总和以及 Oracle 中的多表连接

java - 事务提交后更新查询未刷新

java - 编写引用现有 Java 类的代码生成器

sql - 如何使用 dblink_connect 和 dblink_connect_u

java - 将通知安排在特定日期和时间

sql - postgresql 改变字符变化到字符变化数组

java - 服务器 tomcat v8.0 本地主机上的服务器无法在 45 秒内启动

java - 'hibernate.dialect' 必须在没有连接可用错误时设置

Java 类路径困惑

java - TextView 中不区分大小写的突出显示