是否可以在 Spring 存储库中使用原始 SQL

我需要在 SpringDataRepository 中使用原始 SQL,这可能吗?我在 @Query周围看到的所有东西都是基于实体的。

253036 次浏览

@ Query 注释允许通过将 nativeQuery 标志设置为 true 来执行本机查询。

引自 Spring Data JPA 参考文件

另外,关于如何使用命名本机查询,请参见 这部分

也可以使用 Spring Data JDBC,它是构建在 Spring Data Commons 之上的一个完全受支持的 Spring 项目,可以使用原始 SQL 访问数据库,而不需要使用 JPA。

它没有 Spring Data JPA 那么强大,但是如果您希望在不使用像 Hibernate 这样的 ORM 的情况下为简单项目提供轻量级解决方案,那么这是一个值得尝试的解决方案。

我们可以使用 createNativeQuery (“ Here NativeSQL Query”) ;

例如:

Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();

是的,你可以用下面的方法来做:

1. 通过 CrudRepository (投影)

当使用查询方法时,SpringDataRepository 通常返回域模型。但是,有时候,由于各种原因,您可能需要更改该模型的视图。

假设你的实体是这样的:

    import javax.persistence.*;
import java.math.BigDecimal;
    

@Entity
@Table(name = "USER_INFO_TEST")
public class UserInfoTest {
private int id;
private String name;
private String rollNo;
    

public UserInfoTest() {
}


public UserInfoTest(int id, String name) {
this.id = id;
this.name = name;
}
     

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, precision = 0)
public int getId() {
return id;
}
    

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

@Basic
@Column(name = "name", nullable = true)
public String getName() {
return name;
}
    

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

@Basic
@Column(name = "roll_no", nullable = true)
public String getRollNo() {
return rollNo;
}
    

public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}

现在您的 Projectclass 如下所示,它可以显示您需要的字段。

public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}

还有 Your Data Access Object(Dao) is like bellow:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;


import java.util.ArrayList;


public interface UserInfoTestDao extends CrudRepository<UserInfoTest,Integer> {
@Query(value = "select id,name,roll_no from USER_INFO_TEST where rollNo = ?1", nativeQuery = true)
ArrayList<IUserProjection> findUserUsingRollNo(String rollNo);
}

现在,ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)将为您提供用户列表。

2. 使用 EntityManager

假设您的查询是“ < strong > select id,name from users where roll _ no = 1001 ”。

这里的查询将返回一个 id 和 name 列的对象。您的 Response 类如下:

你的回应类是这样的:

public class UserObject{
int id;
String name;
String rollNo;


public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}


public int getId() {
return id;
}


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


public String getName() {
return name;
}


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


public String getRollNo() {
return rollNo;
}


public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}

这里 UserObject 构造函数将获得一个 Object Array 并使用该对象设置数据。

public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}

您的查询执行函数如下:

public UserObject getUserByRoll(EntityManager entityManager,String rollNo) {


String queryStr = "select id,name from users where roll_no = ?1";
try {
Query query = entityManager.createNativeQuery(queryStr);
query.setParameter(1, rollNo);


return new UserObject((Object[]) query.getSingleResult());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}

在这里,你必须输入以下软件包:

import javax.persistence.Query;
import javax.persistence.EntityManager;

现在你的主类,你必须调用这个函数。首先获取 EntityManager 并调用这个 getUserByRoll(EntityManager entityManager,String rollNo)函数。调用程序如下:

这是进口部

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

从这种方式得到 EntityManager:

@PersistenceContext
private EntityManager entityManager;


UserObject userObject = getUserByRoll(entityManager,"1001");

现在在这个 userObject 中有了数据。

注:

GetSingleResult () 返回一个对象数组。

select id,name from users where roll_no = 1001

查询返回一个数组,它是 [0] --> id and [1] -> name

更多信息请访问此 线这条线

谢谢:)

在 SpringRepository 中可以使用原始查询。

      @Query(value = "SELECT A.IS_MUTUAL_AID FROM planex AS A
INNER JOIN planex_rel AS B ON A.PLANEX_ID=B.PLANEX_ID
WHERE B.GOOD_ID = :goodId",nativeQuery = true)


Boolean mutualAidFlag(@Param("goodId")Integer goodId);

这就是简单形式的使用方法

@RestController
public class PlaceAPIController {


@Autowired
private EntityManager entityManager;


@RequestMapping(value = "/api/places", method = RequestMethod.GET)
public List<Place> getPlaces() {
List<Place> results = entityManager.createNativeQuery("SELECT *  FROM places p limit 10").getResultList();
return results;
}
}