我需要根据标签选择产品,这里是表格
productId
,名称,描述,价格等tagId
,名称 product_tags: productId
,tagId
我有2个课程Product
和Tag
,并在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 =标签; }
请注意我只想选择产品而不是标签。以下工作正常
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类进行预测