1

アプリケーションが最も気に入った写真を表示する機能を作成しています。

私はこのクラスを持っています

public class User{
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user", cascade = CascadeType.ALL)
    private Set<UserLikedPhoto> likedPhotos = new HashSet<UserLikedPhoto>();
   //Other properties and accessor methods.
}

写真教室

public class Photo{
    @OneToMany(fetch = FetchType .LAZY ,mappedBy = "pk.photo")
    private Set<UserLikedTrack> likedByUsers = new HashSet<UserLikedTrack>();
        //Other properties and accessor methods
}

CompoundId/CompoundObject

@Embeddable
public class UserLikedPhotoId  implements Serializable {

    @ManyToOne
    private UserProfile user;

    @ManyToOne
    private Photo photo;
    //Other Properties and accessor methods.
}

そして、CompoundObject と日付を保持するクラス

  @Entity
    @AssociationOverrides({
            @AssociationOverride(name = "pk.userId", joinColumns = @JoinColumn(name = "userId")),
            @AssociationOverride(name = "pk.photoid", joinColumns = @JoinColumn(name = "photoId")) })
    public class UserLikedPhoto{

        @EmbeddedId
        private UserLikedPhotoId pk = new UserLikedPhotoId();
        @Column
        @Temporal(TemporalType.DATE)
        private Date date;

           //Other Entities and accssor methods
    }

このクラスで。このタイプのテーブルで生成されます

------------------------------
| date |    UserId   photoId |
-----------------------------
| 2010-12-23  | 1   | 23 |
| 2010-12-21  | 2   | 23 |
| 2010-12-23  | 1   | 24 |
| 2010-12-21  | 5   | 23 |

今、私がやりたいのは、最も投票された写真 (特定の日付のトップ 5 またはトップ 10 かもしれません) を取得することです。この例では、最も投票された写真は写真番号 23 で、2 番目に投票された写真は番号 24 です。

Hibernate では、この種のタスクに対してどのようにクエリを作成しますか?

4

2 に答える 2

0

テストを行わずに最初から正しく設定することは非常に困難ですが、ここに私の試みを示します。

Query q = session.createQuery("select p from 
    Photo as p, 
    (select ulp.pk.photo.photoId as photoId from UserLikedPhoto ulp 
           where ulp.date = :someDate group by ulp.pk.photo.photoId 
                 order by count(ulp.pk.photo.photoId) desc) as top 
    where p.photoId = top.photoId");
q.setParameter("someDate", new Date())
q.setMaxResults(10);
List<Photo> topPhotos = q.list();
于 2013-04-28T13:01:26.360 に答える
0

これを試してはいけません..しかし、試してみてください...うまくいかない場合は、この回答を削除します

select photoId, count(photoId) from UserLikedPhoto group by photoId order by count(photoid) desc

このクエリでは、写真 ID でグループ化しているため、1 つの写真 ID に対して 1 行しかありません。

この写真IDが利用可能な回数のカウントは、写真UserLikedPhotoのいいねの数を教えてくれます...

私たちは des で注文しているので、最も好きなものが一番上になります。最初の 5 または 10 が必要だと尋ねたので、select ステートメントで上位 10 または上位 5 の sql 句を使用できます

したがって、最終的なSQLは次のようになります...

select top 10 photoId, count(photoId) from UserLikedPhoto group by photoId order by count(photoid) desc

Hibernate はネイティブ SQL のサポートも許可します。

于 2013-04-28T12:22:20.577 に答える