使用JPA自定義SQL查詢結果

JPA自定義SQL查詢結果

很多時候都會遇到自定義sql,自定義返回字段,而不是pojo類。這個情況要通過接口定義返回。

直接上代碼

 @Query(value = "select m.field AS field,COUNT(m.field) AS size from MigrationObject m where m.xmlName = ?1 and m.groupName = ?2 group by m.field")
    List<WorkCenter> getKey(String xmlName, String groupName);

對於這種情況,隻返回瞭兩個字段,就需要定義一個接口來接收(註意AS別名的配置)

public interface WorkCenter { 
    String getField();
    String getSize();
}

最後跑一下demo代碼

   List<WorkCenter> list = migrationObjectRepository.getKey("EN_Work centerResource.xml","Key");
        for (WorkCenter workCenter:list){
            System.out.println(workCenter.getField());
            System.out.println(workCenter.getSize());
        }

ARBPL
5
SPRAS
2
CANUM
2
ENDDA
1
WERKS
5

JPA的SQL查詢

一 點睛

JAP通過SQL查詢一般有兩種方法:通過NamedQuery查詢和使用@Query查詢。

二 JPA的NamedQuery查詢

1 說明

Spring Data JPA支持用JPA的NameQuery來定義查詢方法,即一個名稱映射一個查詢語句。

2 定義

@Entity 
@NamedQuery(name = "Person.withNameAndAddressNamedQuery",
query = "select p from Person p where p.name=?1 and address=?2")
public class Person {
    ......
}

3 使用方法

public interface PersonRepo extends JpaRepository<Person,Long>{
    //使用的是NameQuery裡定義的查詢語句,而不是根據方法名稱來查詢
    Person withNameAndAddressNamedQuery(String name,String address);
}

三 使用@Query查詢

1 使用參數索引

public interface PersonRepo extends JpaRepository<Person,Long>{
    @Query("select p from Person p where p.address= ?1")
    List<Person> findByAddress(String address);
}

2 使用命名參數

public interface PersonRepo extends JpaRepository<Person,Long>{
    @Query("select p from Person p where p.name= :name and p.address= :address")
    Person withNameAndAddressQuery(@Param("name")String name,@Param("address")String address);
}

3 更新查詢

public interface PersonRepo extends JpaRepository<Person,Long>{
    @Modifying
    @Transactional
    @Query("update Person p set p.name=?1")
    int setName(String name);//表示更新語句影響的行數
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: