Java 如何构建JPA2.0查询

Java 如何构建JPA2.0查询,java,sql,hibernate,jpa,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)

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

@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;
}

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

CriteriaBuilder
有一个方法。然后连接两个谓词:

cq.where(cb.and(lastCheckedTimeCondition, someEventIdCondition));

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

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

然后使用CriteriaBuilder的和方法将两个谓词组合为一个,如Lukas的回答所示。

我认为这不适合这里的q/a格式。你不应该只是发布一个作业,然后让别人去做。更好的方法是尝试一些东西,当您遇到困难时,请求特定的帮助。对于这种静态查询,JPQL更容易使用。为什么不使用JPQL?此外,一旦您有了JPQL查询,将其转换为标准将更容易。@ArjanTijms好的,我将发布我迄今为止尝试过的内容。@Thomas我已经发布了我迄今为止尝试过的内容。@jbnize谢谢您的建议,但为了与以前的代码保持一致,我需要使用标准API。啊,疯狂,我错过了加入这个案子的必要性。JPA的长篇大论总是让我着迷……嗨,当我使用上面的代码检索事件时,我无法获得相关的注释。存在异常:com.sun.jdi.InvocationException调用方法时发生。你知道为什么会发生这种情况吗?不知道。有堆栈跟踪会有帮助。它没有堆栈跟踪。我可以得到事件列表,但是相关的注释变成了持久性包。很抱歉,现在可以了,这是其他地方的错误,我已经修复了。
Join<Comment, Event> event = c.join(Comment_.event);
Predicate eventIdPredicate = cb.eq(event.get(Event_.eventId), theEventId);