让我们假设以下情况:我有两个实体类Person和Comment。
//Person class
@Entity
public class Person extends AbstractBusinesObject{
@OneToMany(mappedby ="owner")
private List<Comment> comments;
//Comment class
@Entity
public class Comment extends AbstractBusinesObject{
@ManyToOne
private Person owner;
我想知道哪种方法更好(性能,内存效率)来自以下两种方案,以确定特定评论是否属于特定人。
public boolean isUsersComment(Person p, Comment c){
return p.getComments().contains(c);
}
或
public boolean isUsersComment(Person p, Comment c){
CriteriaBuilder cb = getEntitymanager().getCriteriaBuilder();
CriteriaQuery<Comment> cq = cb.createQuery(Comment.class);
Root<Comment> root = cq.from(Comment.class);
cq.select(root).where(cb.and(cb.equal(root, c), cb.isTrue(root.in(p.getComments())));
try{
getEntityManager().createQuery(cq).getSingleResult();
return true;
} catch (NoResultException ex){
return false;
} catch (NoUniqueResultException ex){
throw new IllegalStateException(message);
}
}
据我所知,api会生成数据库查询,而第一个解决方案会在集合中搜索。
感谢您的回答。
ps:我是Criteria API的新手,所以我也接受修复/建议。
修改
好的,我发现这是一个愚蠢的问题;当我宣布双向关系时,解决方案非常简单:
return c.getOwner.equals(p);
无论如何,单向关系的方法是什么?
答案 0 :(得分:0)
取决于原始Collection是否已加载,不是吗?如果加载了Collection,那么它就是一个直接的contains()调用,否则它可能等同于查询(Criteria或JPQL)的作用。
如果Collection很大,那么我总是会经历一个查询(因为我不想加载整个集合)。否则我会使用Collection.contains