spring数据中的本机查询连接 [英] native query join in spring data

查看:105
本文介绍了spring数据中的本机查询连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两类课程:

    @Entity
    public User{
    @Id
    Long id;
    String name;

    @ManyToMany
    List<Mission> missions;

    }

    @Entity
    public Mission{
    @Id
    Long id;
    String name;

    @ManyToMany
    List<User> users;
    }

        public interface MissionRepository extends CrudRepository<Mission, Long> {
          @Query(nativeQuery = true, "select * from mission join user on id = user_id where name = ?1")
          public List<Mission> findByname(String name);
        }

我想知道是否可以在spring数据中使用本机查询连接jpa并且如果查询结果正确映射到上面示例中的实体。

i want to know if it's possible to use a native query join in spring data jpa and if the result of query was correctly mapped into entities like the above example.

有人可以给我一个完整的例子来说明用户。
i必须在我的情况下使用本机查询,我不确定是否有效。

can someone show me a complete example to user this. i must to use a native query in my case and i am not sure that work.

推荐答案

你可以这样做通过使用命名的本机查询和结果集映射
,这里是一个完整的例子

you can do that by using named native query and result set mapping and here is a complete exmaple

任务实体

package com.ntg.crm.internal.entites;

import java.math.BigInteger;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FetchType;
import javax.persistence.FieldResult;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;

@SqlResultSetMapping(name = "Mission.findAllMissionsMapping", entities = @EntityResult(entityClass = Mission.class, fields = {
        @FieldResult(name = "name", column = "mname"), @FieldResult(name = "id", column = "mid")
}))
@NamedNativeQuery(name = "Mission.findAllMissions", query = "select m.id as mid,m.name as mname , info.id uid ,info.name uname from Mission m join user_info_missions um on m.id "
        + "= um.missions_id join user_Info info on info.id = um.user_id where info.name =:userName", resultSetMapping = "Mission.findAllMissionsMapping")

@Entity
public class Mission {

    public Mission() {

    }

    public Mission(BigInteger id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Mission(BigInteger id, String name, List<User> users) {
        super();
        this.id = id;
        this.name = name;
        this.users = users;
    }

    @Id
    BigInteger id;
    String name;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_info_missions", joinColumns = @JoinColumn(name = "missions_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
    List<User> users;

    public BigInteger getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

}

用户实体

package com.ntg.crm.internal.entites;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = "userInfo")
public class User {

    @Id
    long id;
    String name;

    @ManyToMany(targetEntity = Mission.class)
    @JoinTable(name = "user_info_missions", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "missions_id"))
    @JsonIgnore
    List<Mission> missions;

    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public List<Mission> getMissions() {
        return missions;
    }

    public void setMissions(List<Mission> missions) {
        this.missions = missions;
    }

}

存储库功能

public List<Mission> findAllMissions(@Param("userName") String userName);

控制器功能

@Autowired
    TestRepository testRepo;

    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json", consumes = "application/json")
    @ResponseBody
    List<Mission> getall() {
        List<Mission> missions = testRepo.findAllMissions("Test");
        return missions;
    }

这是结果

[
  {
    "id": 1,
    "name": "Mission 1",
    "users": [
      {
        "id": 1,
        "name": "Test"
      }
    ]
  },
  {
    "id": 2,
    "name": "Mission 2",
    "users": [
      {
        "id": 1,
        "name": "Test"
      }
    ]
  }
]

这篇关于spring数据中的本机查询连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆