![](/img/trans.png)
[英][Spring boot ]Error in native query with join spring data jpa
[英]native query join in spring data
我有課:
@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 Data JPA 中使用本機查詢連接,以及查詢結果是否正確映射到上述示例中的實體。
有人可以給我看一個完整的例子來使用它。 在我的情況下,我必須使用本機查詢,但我不確定它是否有效。
您可以通過使用命名的本機查詢和結果集映射來做到這一點,這是一個完整的例子
任務實體
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"
}
]
}
]
@middy62 您可以使用下面的查詢。 我已經使用您的示例來編寫查詢。 希望它可以幫助某人。
@Query(nativeQuery = true, value = "select m from Mission join m.user u where name =:name") public List<Mission> findByname(@Param("name") String name);
請注意,當您在域實體模型上正確映射時,查詢有效。
您可以使用 Native Spring Data JPA 並使用連接。 這將返回對象數組
public interface MissionRepository extends Repository<Mission, Long> {
@Query(value = "SELECT * from mission m
inner join user u
on m.id = u.id
where m.name=:name", nativeQuery = true)
List<Object[]> findByname(@Param("name") string name);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.