我有这样的对象:
@Entity public class DocumentationRecord { @Id @GeneratedValue private long id; private String topic; private boolean isParent; @OneToMany private List<DocumentationRecord> children; ... }
现在我只想获取主题和ID。有没有办法像这样获得它:
[ { id: 4234234, topic: "fsdfsdf" },... ]
因为即使只使用此查询
public interface DocumentationRecordRepository extends CrudRepository<DocumentationRecord, Long> { @Query("SELECT d.topic as topic, d.id as id FROM DocumentationRecord d") List<DocumentationRecord> getAllTopics(); }
我只能得到这样的记录:
[ [ "youngChild topic", 317 ], [ "oldChild topic", 318 ], [ "child topic", 319 ], ]
我不希望获得具有属性ID和主题的对象数组。实现这一目标的最好方法是什么?
在Spring Data JPA中,您可以使用投影:
基于接口 :
public interface IdAndTopic { Long getId(); String getTopic(); }
基于类 (DTO):
@Value // Lombok annotation public class IdAndTopic { Long id; String topic; }
然后在您的仓库中创建一个简单的查询方法:
public interface DocumentationRecordRepository extends CrudRepository<DocumentationRecord, Long> { List<IdAndTopic> findBy(); }
您甚至可以创建动态查询方法:
List<T> findBy(Class<T> type);
然后像这样使用它:
List<DocumentationRecord> records = findBy(DocumentationRecord.class); List<IdAndTopic> idAndTopics = findBy(IdAndTopic.class);