2012-12-02 14 views
5

İki varlık vardır:Yay Verilerinde "toplu işle göre düzen" nasıl yapılır?

ResourceFile:

@Entity 
@Table(name = "resource_file") 
public class ResourceFile extends IdEntity<Integer> { 

    @Id 
    @SequenceGenerator(name = "resource_file_id_generator", sequenceName = "resource_file_id", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "resource_file_id_generator") 
    @Column(name = "id", unique = true, nullable = false) 
    @Nonnegative 
    private Integer id; 

    ... 
} 

FavoriteResourceFile:

@Entity 
@Table(name = "favorite_resource_file") 
@Cacheable 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class FavoriteResourceFile extends IdEntity<FavoriteResourceFileId> { 

    @EmbeddedId 
    private FavoriteResourceFileId id; 

    @MapsId("resourceFileId") 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "resource_file_id", nullable = false) 
    private ResourceFile resourceFile; 

    ... 

} 

Ben de "aşağıdaki sorguyu oluşturan tüm kaynak dosyaları seçmek ve favori kaynak dosyanın sayımı göre sıralamak istiyorum ".

SQL benzediğini:

select rf.id, count(frf.resource_file_id) from resource_file rf 
left join favorite_resource_file frf on frf.resource_file_id = rf.id 
group by rf.id 
order by count(rf.id) desc; 

Ama sonunda ResourceFile varlığa eşleme yapmak için Bahar Veriler ve nasıl bunu nasıl anlayamıyorum.

Bazı sınırlamaları:

    farklı modüllerde bulunan çünkü ResourceFile içinde FavoriteResourceFile için ilişkisi yapamaz
  • Ben yerli SQL veya JPA sorgu kullanmak istemiyorum
  • (dizeleri olarak).
  • Meta modelleri, Teknik Belirtimi veya QueryDSL'yi kullanmak tercih edilir çünkü bunlar zaten projede kullanılır.

Birisi bana yardımcı olabilir mi?

Son nokta Repo:

public interface ResourceFileRepository extends 
    PagingAndSortingRepository<ResourceFile, Integer>, 
    ResourceFileRepositoryCustom { 
} 

Özel Repo:

public interface ResourceFileRepositoryCustom { 
    List<ResourceFile> getResourceFilesOrderByFavourites(); 
} 

Özel

cevap

6

Bunu, Crud/PagingAndSorting depo uygulaması ile birlikte özel depo uygulaması kullanabilirsiniz ResourceFile'ın favori sayıya göre sıralanmasını sağlayan gerçek kodla repo uygulaması (ResourceFileRepositoryImpl ve R değil) esourceFileRepositoryCustomImpl).

Gömülü anahtarları almadım, bu yüzden biraz basitleştirmek zorunda kaldım. Sorgu FavoriteResourceFile FROM gidiyor, çünkü ResourceFile FavoriteResourceFile ile kendi ilişkisi yoktur. https://github.com/rchukh/StackOverflowTests/tree/master/13669324

: çıkış/çatal/vb -
public class ResourceFileRepositoryImpl implements ResourceFileRepositoryCustom { 
    @PersistenceContext 
    private EntityManager em; 

    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 

    @Override 
    public List<ResourceFile> getResourceFilesOrderByFavourites() { 
     CriteriaBuilder criteriaBuilder = this.em.getCriteriaBuilder(); 
     CriteriaQuery<ResourceFile> q = criteriaBuilder 
       .createQuery(ResourceFile.class); 
     Root<FavoriteResourceFile> root = q.from(FavoriteResourceFile.class); 
     Join<FavoriteResourceFile, ResourceFile> join = root.join(
       FavoriteResourceFile_.resourceFile, JoinType.LEFT); 
     q.select(join); 
     q.groupBy(join.get(ResourceFile_.id)); 
     q.orderBy(criteriaBuilder.desc(
         criteriaBuilder.count(
          join.get(ResourceFile_.id)))); 

     TypedQuery<ResourceFile> query = this.em.createQuery(q); 
     return query.getResultList(); 
    } 
} 

(bazı çok temel sql ve testi ile) tam bir örnek projeyi görmek için
İlgili konular