[英]Retrieve JPQL Query as DTO in Spring boot application
我基本上要做的是運行查詢並將結果放入Account
類的對象中。 需要強調的是,該查詢在 2 個未映射為@Entity
表之間執行 JOIN。 那我該怎么做呢?
這是我的FooRepository.java類
@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
Foo findById(Long id);
@Query(value = "SELECT Q1.ACCOUNT_NAME," +
"Q2.GROUP_NAME " +
"FROM USERS_DEV Q1\n" +
"JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME\n" +
"WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.pit'", nativeQuery = true)
List<Account> getAllAccounts();
那么如何更改我的查詢以獲得所需的結果呢?
這是我的Account.java類
public class Account {
String samAccountName;
String groupName;
public Account(String accountName, String groupName) {
this.accountName = accountName;
this.groupName = groupName;
}
public String getAccountName() {
return accountName;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
您可以使用EntityManager
和ResultTransformer
:
entityManager.createNativeQuery(
"SELECT Q1.ACCOUNT_NAME," +
"Q2.GROUP_NAME " +
"FROM USERS_DEV Q1 " +
"JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME " +
"WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.pit'"
)
.unwrap(NativeQuery.class)
.setResultTransformer(new ResultTransformer() {
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
return new Account(
(String) tuple[0],
(String) tuple[1]
);
}
@Override
public List transformList(List collection) {
return collection;
}
})
.getResultList();
可能需要演員陣容。
也許我錯了,但我記得您可以執行以下操作(使用 HQL):
@Query("select new Account(u.name, g.groupName) " +
"from User as u" +
"join u.group as g" +
"where LOWER(u.name) = 'john.pit'")
語法可能是錯誤的,但我相信如果您使用 HQL,您可以在 select 語句中使用 DTO 構造函數。
希望這會幫助你:D
作為替代,您可以使用@NamedNativeQuery
與@SqlResultSetMapping
以下列方式:
@Entity
@NamedNativeQuery(
name = "findAllAccounts",
query =
"SELECT " +
" Q1.ACCOUNT_NAME AS accountName, " +
" Q2.GROUP_NAME AS groupName " +
"FROM USERS_DEV Q1 " +
"JOIN USERS_GROUPS Q2 ON Q1.ACCOUNT_NAME = Q2.ACCOUNT_NAME " +
"WHERE LOWER(Q1.ACCOUNT_NAME) = 'john.pit'",
resultSetMapping = "findAllAccountsMapping"
)
@SqlResultSetMapping(
name = "findAllAccountsMapping",
classes = @ConstructorResult(
targetClass = Account.class,
columns = {
@ColumnResult(name="accountName"),
@ColumnResult(name="groupName"),
}
)
)
public class Foo {
// ...
}
和FooRepository
:
@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
@Query(name = "findAllAccounts", nativeQuery = true)
List<Account> getAllAccounts();
}
有關其他詳細信息,請參閱休眠文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.