我正在處理具有多個關系的資料庫,如何僅回傳我需要的表及其某些列,而不是 findAll() 回傳的表、相關表和與該表相關的表等等。
我得到的是類似的東西:
{
"id":1 ,
"title": "foo",
"writer": {
"id":6,
"name": "name",
"group": {
"id":3,
"name":"group"
}
}
}
我怎么能得到這樣的東西:
{
"id":1 ,
"title": "foo",
"writer": {
"name": "name",
}
}
我應該使用 jpql 嗎?否則,最好的方法是什么。
uj5u.com熱心網友回復:
一種可能性是為此依賴 JPQL。假設您的物體類被呼叫Article,它將是以下內容:
@Query("select article.id, article.title from Article article")
List<Article> getAllArticlesOptimized();
您可以在https://www.appsdeveloperblog.com/specific-columns-jpa-native-query/閱讀更多相關資訊。
另一種可能性是投影,以便您可以有選擇地檢索物體的部分視圖。您將宣告一個介面,該介面公開要讀取的屬性的訪問器方法:
interface ArticleSummary {
Long getId();
String getTitle();
WriterSummary getWriter();
interface WriterSummary {
String getName();
}
}
您可以將其用作存盤庫中的回傳型別:
interface ArticleRepository extends Repository<Article, Long> {
List<ArticleSummary> findAll();
}
uj5u.com熱心網友回復:
您可以使用本機查詢和ResultTransformer:
@PersistenceContext
private EntityManager entityManager;
@Override
public Optional<ArticleDTO> getArticle(final long id) {
final Session sess = entityManager.unwrap(Session.class);
return sess.createNativeQuery(
"select a.id, a.title, w.name from Article a left outer join Writer w on a.writer_id = w.id where a.id = :id")
.setParameter("id", id)
.addScalar("id", LongType.INSTANCE)
.addScalar("name", StringType.INSTANCE)
.addScalar("title", StringType.INSTANCE)
.setResultTransformer(new ArticleResultTransformer())
.uniqueResultOptional();
}
public static class ArticleResultTransformer extends BasicTransformerAdapter {
@Override
public Object transformTuple(final Object[] tuple, final String[] aliases) {
final Optional<String> writerName = Optional.ofNullable((String) tuple[2]);
final WriterDTO writer = writerName.map(name -> new WriterDTO(name)).orElse(null);
return new ArticleDTO((Long) tuple[0], (String) tuple[1], writer);
}
}
另見:
Hibernate 支持物體查詢(JPQL/HQL 和 Criteria API)和原生 SQL 陳述句。物體查詢僅在您需要修改獲取的物體時才有用,因此受益于自動臟檢查機制。
對于只讀事務,您應該獲取 DTO 投影,因為它們允許您選擇滿足特定業務用例所需的盡可能多的列。這有很多好處,比如減少當前運行的持久化背景關系的負載,因為不需要管理 DTO 投影。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352157.html
