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);