Java 可以在Spring存储库中使用原始SQL吗
我需要在Spring数据存储库中使用原始SQL,这可能吗?我在Java 可以在Spring存储库中使用原始SQL吗,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我需要在Spring数据存储库中使用原始SQL,这可能吗?我在@Query周围看到的一切都是基于实体的 @Query注释允许通过将nativeQuery标志设置为true来执行本机查询 引用Spring数据JPA 另外,请参阅如何使用命名的本机查询。也可以使用,这是一个构建在Spring数据共享空间之上的社区项目,用于在不使用JPA的情况下使用原始SQL访问数据库 它不如SpringDataJPA强大,但如果您希望在不使用Hibernate之类的ORM的情况下为简单项目提供轻量级解决方案,那么这
@Query
周围看到的一切都是基于实体的
@Query注释允许通过将nativeQuery标志设置为true来执行本机查询
引用Spring数据JPA
另外,请参阅如何使用命名的本机查询。也可以使用,这是一个构建在Spring数据共享空间之上的社区项目,用于在不使用JPA的情况下使用原始SQL访问数据库
它不如SpringDataJPA强大,但如果您希望在不使用Hibernate之类的ORM的情况下为简单项目提供轻量级解决方案,那么这是一个值得尝试的解决方案。我们可以使用createNativeQuery(“此处为本机SQL查询”) 例如:
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
Query q=em.createNativeQuery(“从作者a中选择a.firstname、a.lastname”);
列出作者=q.getResultList();
是的,您可以通过以下方式执行此操作:
1。按积存(预测)
Spring数据存储库在使用查询方法时通常返回域模型。但是,有时,由于各种原因,您可能需要更改该模型的视图
假设您的实体如下所示:
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;
}
}
现在你们的投影课就像贝娄。它可以为您提供所需的字段
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
您的数据访问对象(Dao)如下所示:
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);
}
在这里,UserObject构造函数将获得一个对象数组,并使用对象设置数据
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中有了数据
注意:
query.getSingleResult()返回一个对象数组。您必须使用查询列位置来维护列位置和数据类型
select id,name from users where roll_no = 1001
查询返回一个数组,它是[0]-->id和[1]->name
更多信息请访问此
谢谢:)可以在Spring存储库中使用原始查询
@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;
}
}
@RestController
公共类PlaceApicController{
@自动连线
私人实体管理者实体管理者;
@RequestMapping(value=“/api/places”,method=RequestMethod.GET)
公共列表getPlaces(){
List results=entityManager.createNativeQuery(“从位置p限制10中选择*).getResultList();
返回结果;
}
}
SqlQuery可以吗?我如何在存储库中使用它?或者我不使用repo,只在我的服务中使用该对象吗?你使用spring data jpa吗?@Webnet我对spring有点陌生,但在我看来,你可以使用它作为对象。你尝试过spring JDBCTemplate吗?@user454322,参数以1开头,所以它是:@Query(value=“SELECT*FROM USERS WHERE EMAIL\u ADDRESS=?1”,nativeQuery=true)
nativeQuery=true将我从IllegalArgumentException中解救出来,如果您还演示了如何创建em
变量,这将非常有用/完整。em是“javax.persistence.EntityManager”。在我的例子中,我只是@Autowired it.Yes。实体管理器类
@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;
}
}