我有一个country和state表,我已经与spring数据jpa进行了集成。我已经创建了一个函数 public Page<CountryDetails> getAllCountryDetails
在我的countryserviceinmpl中获取所有国家和相应的州详细信息。服务运行良好,并提供以下输出:
{
"content": [
{
"id": 123,
"countryName": "USA",
"countryCode": "USA",
"countryDetails": "XXXXXXXX",
"countryZone": "XXXXXXX",
"states": [
{
"id": 23,
"stateName": "Washington DC",
"countryCode": "USA",
"stateCode": "WAS",
"stateDetails": "XXXXX",
"stateZone": "YYYYYY"
},
{
"id": 24,
"stateName": "Some Other States",
"countryCode": "USA",
"stateCode": "SOS",
"stateDetails": "XXXXX",
"stateZone": "YYYYYY"
}
]
}
],
"last": false,
"totalPages": 28,
"totalElements": 326,
"size": 12,
"number": 0,
"sort": null,
"numberOfElements": 12,
"first": true
}
我的完整代码如下:
countryrepository.java文件
@Repository
public interface CountryRepository extends JpaRepository<CountryDetails, Integer> {
@Query(value = "SELECT country FROM Country country GROUP BY country.countryId ORDER BY ?#{#pageable}",
countQuery = "SELECT COUNT(*) FROM Country country GROUP BY country.countryId ORDER BY ?#{#pageable}")
public Page<CountryDetails> findAll(Pageable pageRequest);
}
countryserviceimpl.java版本
@Service
public class CountryServiceImpl implements CountryService {
@Autowired
private CountryRepository countryRepository;
@Override
public Page<CountryDetails> getAllCountryDetails(final int page, final int size) {
return countryRepository.findAll(new PageRequest(page, size));
}
}
countrydetails.java文件
@Entity
@Table(name = "country", uniqueConstraints = @UniqueConstraint(columnNames = "id"))
public class CountryDetails {
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
private Integer id;
private String countryName;
private String countryCode;
private String countryDetails;
private String countryZone;
@JsonManagedReference
@OneToMany(fetch = FetchType.LAZY, mappedBy = "countryDetails")
private List<State> states;
// getters / setters omitted
}
状态.java
@Entity
@Table(name = "state", uniqueConstraints = @UniqueConstraint(columnNames = "id"))
public class State {
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
private Integer id;
private String stateName;
private String countryCode;
private String stateCode;
private String stateDetails;
private String stateZone;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "countryCode", nullable = false, insertable = false, updatable = false, foreignKey = @javax.persistence.ForeignKey(name="none",value = ConstraintMode.NO_CONSTRAINT))
private CountryDetails countryDetails;
// getters / setters omitted
}
现在问题来了
实际上,我希望国家服务返回如下所示的最低限度的信息
{
"content": [
{
"countryName": "USA",
"countryCode": "USA",
"states": [
{
"stateCode": "WAS"
},
{
"stateCode": "SOS"
}
]
}
],
"last": false,
"totalPages": 28,
"totalElements": 326,
"size": 12,
"number": 0,
"sort": null,
"numberOfElements": 12,
"first": true
}
为了实现这一点,我使用了如下所示的投影
countryprojection.java语言
public interface CountryProjection {
public String getCountryName();
public String getCountryCode();
public List<StateProjection> getStates();
}
stateprojection.java语言
public interface StateProjection {
public String getStateCode();
}
countryserviceimpl.java版本
@Repository
public interface CountryRepository extends JpaRepository<CountryDetails, Integer> {
@Query(value = "SELECT country.countryName AS countryName, country.countryCode AS countryCode FROM Country country GROUP BY country.countryId ORDER BY ?#{#pageable}",
countQuery = "SELECT COUNT(*) FROM Country country GROUP BY country.countryId ORDER BY ?#{#pageable}")
public Page<CountryProjection> findAll(Pageable pageRequest);
}
但是现在服务返回如下所示的任何状态详细信息
{
"content": [
{
"countryName": "USA",
"countryCode": "USA"
}
],
"last": false,
"totalPages": 28,
"totalElements": 326,
"size": 12,
"number": 0,
"sort": null,
"numberOfElements": 12,
"first": true
}
我们怎样才能得到如下所示的最小状态细节
{
"content": [
{
"countryName": "USA",
"countryCode": "USA",
"states": [
{
"stateCode": "WAS"
},
{
"stateCode": "SOS"
}
]
}
],
"last": false,
"totalPages": 28,
"totalElements": 326,
"size": 12,
"number": 0,
"sort": null,
"numberOfElements": 12,
"first": true
}
有人能帮我吗
5条答案
按热度按时间lsmepo6l1#
你可以做你的
CountryService
返回dto,而不是只包含所需字段的实体。服务
dto公司
rkue9o1l2#
第一个想法
在我看来,你做事的方式有些不对劲。我不明白你为什么这样直接定义查询:
基本上就是,通过选择来创建投影。
另一方面,您使用的是基于接口的投影,它再次执行投影,但是通过公开要投影的属性的getter。据我所知,您通过接口很好地定义了层次结构,这应该是一种有效的方法。
所以我想问的是,你有没有试着把
@Query
一起分开?第二个想法(在评论中)
另一个想法是使用
join fetch
构造jpql
它告诉hibernate用查询急切地加载关联。ibps3vxo3#
您可以查看注解文档:
@jsonignoreproperties(“字段名”)
此注解需要应用于case country*、state*中的pojo类,其中提到了不需要作为响应一部分的逗号分隔字段列表。
您可以尝试这种方法,而不是更改为投影样式的实现。
9cbw7uwe4#
你可以用
transient
关键字中包含您不希望在json中使用的变量。你用别的方法吗
f8rj6qna5#
尝试对返回json中不需要的字段使用jsonignore