【问题标题】:How to insert into db in spring-data?如何在spring-data中插入数据库?
【发布时间】:2016-01-04 12:28:00
【问题描述】:

我想提出一个将数据插入我的数据库的请求。该表有 4 列:ID_DOCUMENT (PK)、ID_TASK、DESCRIPTION、FILEPATH

实体

... 
@Column(name = "ID_TASK")
private Long idTask;


@Column(name = "DESCRIPTION")
private String description;

@Column(name = "FILEPATH")
private String filepath;
...

存储库

@Modifying
@Query("insert into TaskDocumentEntity c (c.idTask, c.description, c.filepath) values (:id,:description,:filepath)")
public void insertDocumentByTaskId(@Param("id") Long id,@Param("description") String description,@Param("filepath") String filepath);

控制器

@RequestMapping(value = "/services/tasks/addDocument", method = RequestMethod.POST)
@ResponseBody
public void set(@RequestParam("idTask") Long idTask,@RequestParam("description") String description,@RequestParam("filepath") String filepath){

    //TaskDocumentEntity document = new TaskDocumentEntity();
    taskDocumentRepository.insertDocumentByTaskId(idTask,descriere,filepath);
}

当我运行我的测试时,我得到了这个错误: 原因:org.hibernate.hql.ast.QuerySyntaxException:期待 OPEN,在第 1 行第 32 列附近找到“c”[插入 TaskDocumentEntity c (c.idTask, c.descriere, c.filepath) 值 (: id,:descriere,:filepath)] 我尝试删除别名 c,但仍然无法正常工作。

【问题讨论】:

  • 删除你的insertDocumentByTaskId。在您的控制器中创建TaskDocumentEntity 的实例,设置属性并调用save 方法。 JPA 的全部意义在于您不必再编写查询...
  • 请发布您的存储库类的代码,不仅是方法声明,还要发布您的spring配置类/xml。

标签: spring spring-data


【解决方案1】:

Spring data 提供了开箱即用的 save 方法用于插入数据库 - 无需使用 @Query。看看springData的核心概念(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts)

因此在您的控制器中只需创建对象 TaskDocumentEntity 并将其传递给存储库

@RequestMapping(value = "/services/tasks/addDocument", method = RequestMethod.POST)
@ResponseBody
public void set(@RequestParam("idTask") Long idTask,@RequestParam("description") String description,@RequestParam("filepath") String filepath){

// assign parameters to taskDocumentEntity by constructor args or setters
        TaskDocumentEntity document = new TaskDocumentEntity(idTask,descriere,filepath);
        taskDocumentRepository.save(document);
    }

【讨论】:

  • 我也试过了,但不持久,没有改变数据库(成功测试)
  • 现在可以了,我没有t inject the service in the test class, and didnt 为请求传递任何参数,反正我已经重写了控制器,非常感谢大家!!!
【解决方案2】:

有一种方法可以做到这一点,但这取决于您使用的数据库。下面在 Oracle 中为我工作(使用双表):

@Repository
public interface DualRepository extends JpaRepository<Dual,Long> {
    @Modifying
    @Query("insert into Person (id,name,age) select :id,:name,:age from Dual")
    public int modifyingQueryInsertPerson(@Param("id")Long id, @Param("name")String name, @Param("age")Integer age);
}

所以在你的情况下,它会是(如果是 Oracle):

@Modifying
@Query("insert into TaskDocumentEntity (idTask,description,filepath) select :idTask,:description,:filepath from Dual")
public void insertDocumentByTaskId(@Param("idTask") Long id,@Param("description") String description,@Param("filepath") String filepath)

我不确定您使用的是哪个 db,这是一个链接,底部显示了哪个 db 支持不带 from 子句的 select stmts:http://modern-sql.com/use-case/select-without-from

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2021-10-26
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2015-10-07
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多