這是一個有爭議的問題。如果你不想創建單獨的dto,有幾種方法可以做到這一點。這取決於您要使用的數據訪問方式:
使用Spring數據JPA可以在投影中返回實體。你只需要一個額外的構造函數添加到您的實體:
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select new User(u.id,u.name) from User u")
List<User> findAllUserItems();
}
或者相同的使用JPA EntityManger:
public List<User> findAllUserItems() {
return entityManager.createQuery("select new User(u.id,u.name) from User u", User.class)
.getResultList();
}
如果你想知道不必要的空字段,並且您使用傑克遜,可配置忽略空字段。春季啓動:
spring.jackson.default-property-inclusion=non_null
或者與Java的配置:
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
return builder;
}
或者不春天啓動項目:
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
public HttpMessageConverter converter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return new MappingJackson2HttpMessageConverter(objectMapper);
}
}
另外,如果你打算使用Hibernate的Session。爲了直接映射到DTO你可以使用AliasToBeanResultTransformer
:
public List<UserDto> findAllUserItems() {
return session.createQuery("select u.id as id,u.name as name from User u")
.setResultTransformer(Transformers.aliasToBean(UserDto.class))
.list();
}
我覺得是更優雅,如果你創建你的API另一層在那裏你可以提出一個要求用戶通過ID只得到部分值,不具有意義,如果你獲取所有值僅用於從DTO響應中獲取一個值。 –