【问题标题】:Using Criteria API or java.util.List contains() method?使用 Criteria API 或 java.util.List contains() 方法?
【发布时间】:2013-04-09 17:19:04
【问题描述】:

让我们假设以下情况:我有两个实体类 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);
    }
}

据我所知,criteria api 生成一个数据库查询,而第一个解决方案在集合中搜索。

感谢您的回答。

ps:我是 Criteria API 的新手,所以我也接受修复/建议。

编辑

好吧,我发现这是一个愚蠢的问题;正如我声明的双向关系,解决方案非常简单:

return c.getOwner.equals(p);

无论如何,单向关系的情况是什么?

【问题讨论】:

    标签: performance jpa criteria-api memory-efficient


    【解决方案1】:

    取决于原始集合是否已经加载,不是吗?如果 Collection 被加载,那么它是一个直接的 contains() 调用,否则它可能相当于查询(Criteria 或 JPQL)会做的事情。

    如果集合很大,那么我会一直进行查询(因为我不想加载整个集合)。否则我会使用 Collection.contains

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2011-04-20
      • 1970-01-01
      • 2015-11-25
      • 2014-02-19
      • 1970-01-01
      • 2016-10-04
      相关资源
      最近更新 更多