【问题标题】:writing queries on springboot在 Spring Boot 中编写查询
【发布时间】:2018-09-04 05:46:54
【问题描述】:

由于某些特定目的,我必须在 springboot 上编写一个查询,但我正在尝试使用传递的值编写查询,但它会产生大量错误,我确信这不是方法。我已经浏览了 @Query 的 Jpa 和 springboot 文档,但没有发现任何有用的信息。那么如何编写这种类型的查询呢?

@Query("INSERT into LaganikartaDetails(?1)values(?2)")
void setValuesExcel(String headingValues, String fieldValues);

【问题讨论】:

  • @Patrick 请仔细查看问题。我已经阅读了该文档。我正在尝试通过参数发送查询中的字段名和值。
  • 问题是“你为什么要写这种类型的查询”?因为在我看来,这既是使用数据库的错误方式(您不是逐个字段地插入内容,而是逐行插入),也是使用 Hibernate 的错误方式(您不使用 SQL 处理插入,您使用 EntityManager#persist 之类的东西。)
  • @Tobb 我正在编写这种类型的查询,因为在我的程序中不确定哪个字段名会出现,所以我有义务这样做。如果您知道任何替代方案,请提出建议。
  • 也许可以更广泛地解释您要解决的问题,因为通过 @Query 进行 INSERT 似乎很奇怪。

标签: mysql hibernate spring-boot spring-data-jpa


【解决方案1】:
Referring this, https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

try 
@Query("INSERT into LaganikartaDetails =?1 values=?2")
void setValuesExcel(String headingValues, String fieldValues);

【讨论】:

    【解决方案2】:

    不使用insert方法,可以使用repository save方法。它会自动保存您尝试使用存储库方法保存的任何对象。这里分享一个模拟插入数据库的代码sn-p,

    @Autowired
    DriverRepository driverRepo;
    
    @RequestMapping(value="/driverSubmit", method=RequestMethod.POST)
    public ModelAndView driverSubmit(@ModelAttribute Driver driver) 
        {
            driverRepo.save(driver);
            return new ModelAndView("redirect:/driverHome");  
        }
    

    这里的 driverRepo 是这里自动装配的存储库对象。您提到哪个是调用 .save 方法的对象数据。这是 Spring Data JPA 存储库方法。您不需要使用插入查询。

    【讨论】:

      【解决方案3】:

      您可以使用此查询手动插入:

      @Query("INSERT into LaganikartaDetails =? values=?")
      void setValuesExcel(String headingValues, String fieldValues);
      

      【讨论】:

        【解决方案4】:

        如果需要在实体中持久化的字段是动态的,则可以创建一个映射器类来检查输入属性是否为空或为空,然后将其设置在实体中。最后你可以调用 entity.save()。

        例如:

        员工具有姓名、薪水、年龄、联系电话等属性 你可以写如下 if(StringUtils.isNotBlank(name){ employee.setName(name); }

        对于其他字段类似,一旦对所有字段完成此操作,最终您可以调用employee.save()

        【讨论】:

          猜你喜欢
          • 2016-03-22
          • 1970-01-01
          • 1970-01-01
          • 2022-09-22
          • 2018-10-02
          • 2018-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多