gpt4 book ai didi

java - Spring 数据中的 native 查询连接

转载 作者:行者123 更新时间:2023-12-03 18:36:56 25 4
gpt4 key购买 nike

我有课:

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

@ManyToMany
List<Mission> missions;
}

@Entity
public class 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 中使用 native 查询连接,以及查询结果是否正确映射到上述示例中的实体中。

有人可以向我展示一个完整的示例来使用它。
在我的情况下,我必须使用 native 查询,但我不确定是否可行。

最佳答案

您可以通过使用命名 native 查询和结果集映射来做到这一点
这是一个完整的例子

任务实体

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);

Controller 功能
@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"
}
]
}
]

关于java - Spring 数据中的 native 查询连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com