Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 条件API加入惰性集合_Hibernate_Collections_Lazy Loading_Criteria Api - Fatal编程技术网

Hibernate 条件API加入惰性集合

Hibernate 条件API加入惰性集合,hibernate,collections,lazy-loading,criteria-api,Hibernate,Collections,Lazy Loading,Criteria Api,我有以下设置 @Entity @Table(name = "Product") public class Product implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; @OneToMany(cascade = CascadeType.MERGE, fetch = Fet

我有以下设置

@Entity
@Table(name = "Product")
public class Product implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

    @OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
    private final List<Item> itemlist = new ArrayList<Item>();

    //some other attributes, getter/setter
}

@Entity
@Table(name = "Item")
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private Date startDate;

    //some other attributes, getter/setter
}
@实体
@表(name=“产品”)
公共类产品实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串名称;
@OneToMany(cascade=CascadeType.MERGE,fetch=FetchType.LAZY)
private final List itemlist=new ArrayList();
//其他一些属性,getter/setter
}
@实体
@表(name=“Item”)
公共类项实现可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私人日期开始日期;
//其他一些属性,getter/setter
}
这些类之间的连接只是单向的。双向连接是否更好(例如在性能方面)

如何查询在某个日期(startDate)之后启动并分配给特定产品的所有项目

我尝试用api标准实现这一点:

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
criteriaQuery = criteriaQuery.distinct(true);

Metamodel m = em.getMetamodel();
EntityType<Product> Product_ = m.entity(Product.class);
Root<Product> root = criteriaQuery.from(Product_);
Join join = root.join("itemlist");


Predicate condition = criteriaBuilder.equal(join.get("product"), selectedProduct);
criteriaQuery.where(condition);

criteriaQuery.select(join);

TypedQuery<Item> tq = em.createQuery(criteriaQuery);
System.out.println("result " + tq.getResultList());
CriteriaBuilder-CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery(Item.class);
criteriaQuery=criteriaQuery.distinct(true);
元模型m=em.getMetamodel();
EntityType产品=m.entity(产品类);
Root=criteriaQuery.from(产品);
Join-Join=root.Join(“itemlist”);
谓词条件=criteriaBuilder.equal(join.get(“产品”),selectedProduct);
criteriaQuery.where(条件);
criteriaQuery.select(join);
TypedQuery tq=em.createQuery(criteriaQuery);
System.out.println(“结果”+tq.getResultList());
我得到了一个例外:

org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.test.Product.itemlist,未关闭任何会话或会话


我的查询或惰性项列表有问题吗?

这可能已经过时,但我手头有代码。我就是这样解决这个问题的:

    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Product> criteriaQuery = criteriaBuilder.createQuery(Product.class);
    Root<Product> queryRoot = criteriaQuery.from(Product.class);

    Predicate idPredicate = criteriaBuilder.equal(queryRoot.get(Product_.id), id);
    criteriaQuery.where(idPredicate);

    TypedQuery<Product> typedQuery = em.createQuery(criteriaQuery);

    Product theProduct = typedQuery.getSingleResult();

    //this triggers the lazy relationship
    theProduct.getItemsList();
CriteriaBuilder-CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery(Product.class);
Root queryRoot=criteriaQuery.from(Product.class);
谓词idPredicate=criteriaBuilder.equal(queryRoot.get(Product.id),id);
criteriaQuery.where(idPredicate);
TypedQuery TypedQuery=em.createQuery(criteriaQuery);
Product theProduct=typedQuery.getSingleResult();
//这触发了懒惰的关系
product.getItemsList();


Federico

在任何生产代码中都这样做,您的性能将付诸东流。最终会出现多个查询。因此,您的解决方案有效。这是一个可怕的解决办法。您最好使用CriteriaAPI或实体图编写自己的JPQL。