Java 可以在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的情况下为简单项目提供轻量级解决方案,那么这

我需要在Spring数据存储库中使用原始SQL,这可能吗?我在
@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;
 }


}