JPA QueryDSL exists and count

11,614

Here is a sketch for a solution

QAssetobject t = QAssetobject.assetobject;
QAssetData ad = QAssetData.assetData;
QAssetobjectParents p = QAssetobjectParents.assetobjectParents;

List<Tuple> results = query.from(t)
  .leftJoin(ad).on(t.asdId.eq(ad.asdId))
  .where(new SQLSubQuery().from(p)
         .where(t.asoId.eq(p.asoId), p.ctdId.eq(1)).exists())
  .groupBy(t.asdId)
  .orderBy(Wildcard.count.desc(), t.asdId.asc())
  .list(t.asdId, Wildcard.count);
Share:
11,614
Philipp Schneider
Author by

Philipp Schneider

Senior Software Architect and Developer

Updated on June 13, 2022

Comments

  • Philipp Schneider
    Philipp Schneider almost 2 years

    I'm trying to got these SQL-Statement to a QueryDSL call.

       select t.asd_id, count(*) as count from asset_object t 
         left join asset_data ad on (t.asd_id = ad.asd_id)
         where
           exists (select * from assetobject_parents p 
                   where t.aso_id = p.aso_id and p.ctd_id = 1)
         group by t.asd_id
         order by count(*) desc, t.asd_id asc
    

    Can anyone give me a hint or a solution?

    Here is my Domain (extract):

    @Entity
    public class AssetObject {
    
        @Id
        @Column(name = "ASO_ID")
        private Long asoId;
    
    
        @ManyToMany
        @OrderColumn(name = "ASP_ORDER")
        @JoinTable(name = "ASSETOBJECT_PARENTS", joinColumns = { @JoinColumn(name = "ASO_ID", referencedColumnName="ASO_ID") }, inverseJoinColumns = { @JoinColumn(name = "CTD_ID", referencedColumnName="CTD_ID") })
        private List<CategoryData> parents = new ArrayList<CategoryData>();
    
    }
    
    @Entity
    public class CategoryData {
    
        @Id
        @Column(name = "CTD_ID")
        private Long ctdId;
    
    }
    
    
    @Entity
    @Table(name = "ASSET_DATA")
    public class AssetData {
    
        @Id
        @Column(name = "ASD_ID")
        private Long asdId;
    
        @ManyToMany
        @JoinTable(name = "ASSETDATA_CATEGORYDATA", joinColumns = { @JoinColumn(name = "ASD_ID", referencedColumnName="ASD_ID") }, inverseJoinColumns = { @JoinColumn(name = "CTD_ID", referencedColumnName="CTD_ID") })
        private List<CategoryData> categoryDataList = new ArrayList<CategoryData>();
    
    }
    

    Hope this helps a little bit more. I think the main point is that it's not possible to access join-tables with querydsl.