spring jpa @query返回自定義對象

  1. 用jpa時,如果遇到多表關聯(lián),常需要自定義寫sql語句,這時我們經(jīng)常需要自定義返回對象
    例如用戶和部門關系。我們希望查詢用戶信息,同時返回部門的名稱。

案例代碼

https://github.com/wengmingdong/wmdspringtest/tree/master/jparepcustomobj

  1. 假設我們有以下orm
    部門
@Entity
@Table(name = "T_DEPT")
public class Dept implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;
    private String name;
    private Integer upId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getUpId() {
        return upId;
    }

    public void setUpId(Integer upId) {
        this.upId = upId;
    }
}

用戶

@Entity
@Table(name = "T_USER")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;
    private String name;
    private Integer deptId;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }
}
  1. 我們定義了jpa接口DeptRepository和UserRepository
    DeptRepository
@Repository
public interface DeptRepository extends JpaRepository<Dept, Integer> {
}

UserRepository

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    @Query("select new com.wmd.springtest.jparepcustomobj.domain.UserDept(" +
            "u.id, u.name, d.id, d.name" +
            ") " +
            "from User u, Dept d " +
            "where u.deptId=d.id")
    List<UserDept> findAllForUserDept();

    @Query("select new map(" +
            "u.id as user_id, u.name as user_name, d.id as dept_id, d.name as dept_name" +
            ") " +
            "from User u, Dept d " +
            "where u.deptId=d.id")
    List<Map<String, Object>> findAllForMap();
}
  1. UserRepository 定義了兩個方法,一個返回自定義對象,一個返回Map對象

  2. UserDept類

public class UserDept implements Serializable {

    @JsonProperty("user_id")
    private Integer userId;

    @JsonProperty("user_name")
    private String userName;

    @JsonProperty("dept_id")
    private Integer deptId;

    @JsonProperty("dept_name")
    private String deptName;

    public UserDept(Integer userId, String userName, Integer deptId, String deptName) {
        this.userId = userId;
        this.userName = userName;
        this.deptId = deptId;
        this.deptName = deptName;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
}
  1. 定義controller類
@RestController
public class UserDeptController {

    @Autowired
    UserService userService;

    @RequestMapping(value = "/rest/user/custom/rspobj", method = RequestMethod.GET, produces = "application/json")
    List<UserDept> findAllForUserDept() {
        return userService.findAllForUserDept();
    }

    @RequestMapping(value = "/rest/user/custom/map", method = RequestMethod.GET, produces = "application/json")
    List<Map<String, Object>> findAllForMap() {
        return userService.findAllForMap();
    }
}
  1. 訪問http://localhost:8080/rest/user/custom/rspobj,返回內(nèi)容如下:
[
    {
        "user_id": 0,
        "user_name": "員工11",
        "dept_id": 1,
        "dept_name": "人事部"
    },
    {
        "user_id": 1,
        "user_name": "員工12",
        "dept_id": 2,
        "dept_name": "財務部"
    },
    {
        "user_id": 2,
        "user_name": "員工21",
        "dept_id": 2,
        "dept_name": "財務部"
    },
    {
        "user_id": 3,
        "user_name": "員工31",
        "dept_id": 3,
        "dept_name": "研發(fā)部"
    },
    {
        "user_id": 4,
        "user_name": "員工32",
        "dept_id": 3,
        "dept_name": "研發(fā)部"
    }
]
  1. 訪問http://localhost:8080/rest/user/custom/map,返回內(nèi)容如下:
[
    {
        "dept_name": "人事部",
        "dept_id": 1,
        "user_id": 0,
        "user_name": "員工11"
    },
    {
        "dept_name": "財務部",
        "dept_id": 2,
        "user_id": 1,
        "user_name": "員工12"
    },
    {
        "dept_name": "財務部",
        "dept_id": 2,
        "user_id": 2,
        "user_name": "員工21"
    },
    {
        "dept_name": "研發(fā)部",
        "dept_id": 3,
        "user_id": 3,
        "user_name": "員工31"
    },
    {
        "dept_name": "研發(fā)部",
        "dept_id": 3,
        "user_id": 4,
        "user_name": "員工32"
    }
]
  1. 源代碼地址 https://github.com/wengmingdong/wmdspringtest/tree/master/jparepcustomobj
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容