我有两个实体:
的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;
...
}
我想进行以下查询“选择所有资源文件并按喜欢的资源文件计数排序”。
在SQL中看起来像:
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;
但我无法理解如何使用Spring Data以及如何在最后映射到ResourceFile实体。
一些限制:
有人可以帮助我吗?
答案 0 :(得分:6)
您可以使用自定义存储库实现以及Crud / PagingAndSorting存储库实现,如下所示:
终点回购:
public interface ResourceFileRepository extends
PagingAndSortingRepository<ResourceFile, Integer>,
ResourceFileRepositoryCustom {
}
自定义回购:
public interface ResourceFileRepositoryCustom {
List<ResourceFile> getResourceFilesOrderByFavourites();
}
自定义repo实现,使用实际代码来检索按喜欢的计数排序的ResourceFile(注意它是ResourceFileRepositoryImpl而不是ResourceFileRepositoryCustomImpl)。
我没有那些嵌入式键,所以我不得不简化一下。 查询来自FavoriteResourceFile,因为ResourceFile与FavoriteResourceFile没有自己的关系。
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();
}
}
要查看完整的示例项目(带有一些非常基本的sql和测试) - checkout / fork / etc: https://github.com/rchukh/StackOverflowTests/tree/master/13669324