gpt4 book ai didi

Spring-boot 表达投影的最简单方法

转载 作者:行者123 更新时间:2023-12-03 07:07:39 24 4
gpt4 key购买 nike

在这种情况下有一种使用@Projection的简单方法吗?

我的报告实体有很大的字段(例如带有完整HTML文本的内容字段),我不需要在端点传递这些字段。

@Repository
public interface IReportRepository extends BaseRepository<Report, Long> {

List<Report> findAll(); // working fine... BUT with fields that not need

@Query(nativeQuery = true, value= "SELECT id, acronym FROM report")
List<Object[]> findSomeFields1(); // BAD JSON, no field name!

@Query(nativeQuery = true, value= "SELECT id, acronym FROM report")
List<Map> findSomeFields2(); // ERROR! Failed to convert
// there are something as JSON Row Mapper?

}

(ReportController 在端点将其作为 JSON 传递,仅此而已)

而不是 @Query 我需要使用 @Projection(...)...如何使用它(>最简单的方法!)?

最佳答案

作为 Spring 项目存储库中的示例,您可以检查此项目 https://github.com/spring-projects/spring-data-examples/tree/master/rest/projections

无论如何,如果您想更好地控制所获得的数据,您可以使用QueryDSLSpringlets用于从 Spring Data Repositories 返回投影的库。

以下是有关如何使用 QueryDSL 的示例和 Springlets一起:

创建一个仅包含您想要获取的具体字段的新类。例如,对于 Owner实体,您可以创建 OwnerInfo仅包含 id 的投影, firstNamelastName字段。

public class OwnerInfo {

private Long id;

@Size(min = 3, max = 30)
private String firstName;

@NotNull
@Size(min = 3, max = 30)
private String lastName;

}

遵循 Owner例如,创建一个名为 OwnerRepositoryCustom 的新存储库接口(interface)并定义将返回投影的取景器。

public interface OwnerRepositoryCustom {

public Page<OwnerInfo> findByFirstNameLike(String firstName, Pageable pageable);

}

创建 OwnerRepositoryCustom 的实现。这个类应该扩展 QueryDslRepositorySupportExt来自Springlets项目。

public class OwnerRepositoryImpl extends QueryDslRepositorySupportExt<Owner> implements OwnerRepositoryCustom {

OwnerRepositoryImpl() {
super(Owner.class);
}

public Page<OwnerInfo> findByFirstNameLike(String firstName, Pageable pageable) {

QOwner owner = QOwner.owner;

JPQLQuery<Owner> query = from(owner);

if (StringUtils.isNotEmpty(firstName)) {
BooleanBuilder searchCondition = new BooleanBuilder();

searchCondition.and(owner.firstName.eq(firstName));

if (searchCondition.hasValue()) {
query.where(searchCondition);
}
}

Path<?>[] paths = new Path<?>[] {owner.id,owner.firstName,owner.lastName};

AttributeMappingBuilder mapping = buildMapper()
.map(ID, owner.id)
.map(FIRST_NAME, owner.firstName)
.map(LAST_NAME, owner.lastName);

return loadPage(query, pageable, Projections.constructor(OwnerInfo.class, owner.id, owner.firstName, owner.lastName));
}

}

现在,扩展OwnerRepository接口(interface)来自JpaRepository<Owner, Long> and OwnerRepositoryCustom` 接口(interface)。

public interface OwnerRepository extends OwnerRepositoryCustom, JpaRepository<Owner, Long> {

}

通过这些简单的步骤,您将能够在存储库方法中返回投影。

希望对你有帮助

关于Spring-boot 表达投影的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com