休眠标准:如何重置投影

时间:2016-10-17 10:47:29

标签: java mysql hibernate hibernate-criteria

我需要根据标签选择产品,这里是表格

  1. 产品: productId,名称,描述,价格等
  2. 标记: tagId,名称
  3. product_tags: productIdtagId

    我有2个课程ProductTag,并在Product课程中指定了关系

    @OneToMany(cascade = CascadeType.DETACH) @JoinTable(         name =" product_tags",         joinColumns = @JoinColumn(name =" productId"),         inverseJoinColumns = @JoinColumn(name =" tagId") ) public List getTags(){     返回标签; } public void setTags(List tags){     this.tags =标签; }

  4. 注意我只想选择产品而不是标签。以下工作正常

    Criteria cri = getSession().createCriteria(Product.class);
    cri.setFirstResult(index);
    cri.setMaxResults(limit);
    return cri.list();
    

    我正在尝试获取分页列表,因此我需要通过获取totalRecords / recordPerPage

    来检索可以检索的总页数
    Criteria cri = getSession().createCriteria(Product.class);
    //add any required filter to criteria 
    //e.g cri.add(Restrictions.like("name", keyword, MatchMode.ANYWHERE));
    
    //********** Following code is in utility function ******************/
    //Get total number of records matching criteria
    cri.setProjection(Projections.rowCount());
    Long totalRecords = (Long)cri.uniqueResult(); 
    
    //Get paginated records
    cri.setProjection(null);// This is evil but works
    cri.setFirstResult(index);
    cri.setMaxResults(limit);
    paginatedRecords = cri.list();
    

    问题1:是否可以设置cri.setProjection(Product.class)之类的内容而不是将其设置为null,我知道我可以创建投影列表并添加产品类的所有列但这看起来有点过分+常见的部分是在效用函数中,我发现没有办法检索以前的投影。 cri.getProject()

    为什么我需要另一种方法,因为cri.setProjection(null)在应用连接时失败,因为它会投影产品,标签,product_tags的所有列。无法转换为List

    将所有与相关标签ID相关的产品设为(4,5,6)

    cri.createAlias("tags", "t");
    cri.add(Restrictions.in("t.tagId", new Integer[]{4,5,6}));
    

    这是发布的查询

    select
            this_.productId as productId1_9_1_,
            this_.categoryId as category6_9_1_,
            this_.description as descript8_9_1_,
            this_.name as name13_9_1_,
            tags3_.productId as productId1_9_,
            t1_.tagId as tagId2_10_,
            t1_.tagId as tagId1_11_0_,
            t1_.name as name4_11_0_,
        from
            products this_ 
        inner join
            product_tags tags3_ 
                on this_.productId=tags3_.productId 
        inner join
            tags t1_ 
                on tags3_.tagId=t1_.tagId 
        where t1_.tagId in (4,5,6) limit 25
    

    我已经找到了解决方法,如下所示

    cri.setProjection(null)
    criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    

    这将修复类型转换异常。

    问题2:后端查询仍然相同,它会加入并投影所有相关表的所有列。 ((Yakkh dirty)),为什么同样的查询?,我期待仅对Product类进行预测

0 个答案:

没有答案