Spring Boot 学习研究笔记(十) -SpringBoot JAP 踩坑总结

简介: Spring Boot 学习研究笔记(十) -SpringBoot JAP 踩坑总结

SpringBoot JAP 踩坑总结

 

一、 JSON 字段映射处理流程

1、实现类型转换接口

package com.call.show.common.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.io.IOException;
import java.io.Serializable;
@Converter(autoApply = true)
public class JsonConverter implements AttributeConverter<Object,String>,Serializable {
    private final static ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public String convertToDatabaseColumn(Object meta) {
        try {
            return objectMapper.writeValueAsString(meta);
        } catch (JsonProcessingException ex) {
            return null;
        }
    }
    @Override
    public Object convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, Object.class);
        } catch (IOException ex) {
            return null;
        }
    }
}

 

2、实体类中添加注解

@Convert(converter=JsonConverter.class)

例如:

/**
     * 账号信息 备用字段
     */
    @Column(name = "account_info")
    @Convert(converter=JsonConverter.class)
    private  String  accountInfo ;
    /**
     * 扩展信息备用字段
     */
    @Column(name = "extended_info")
    @Convert(converter=JsonConverter.class)
    private  String  extendedInfo ;

二、JPA中的jpql-@Query的查询使用

1、单参数查询

@Query(value="select * from cst_customer where cust_name=?1",nativeQuery = true)


@Query(value="from Customer  where cust_name= ?1")


@Query(value="select c from Customer  c where c.custName=?1")


@Query(value="from Customer c where c.custName=:#{#custName}")


@Query(value="from Customer c where c.custName=:custName") List<Customer> findAllCustomerByName(@Param("custName") String custName);

123456

这几种方式是等价的

  • @Query(value=“select * from cst_customer where cust_name= ?1”,nativeQuery = true)
  • @Query(value=“from Customer where cust_name= ?1”)
  • @Query(value=“select c from Customer c where c.custName=?1”)
  • @Query(value=“from Customer c where c.custName=:#{#custName}”)
  • @Query(value=“from Customer c where c.custName=:custName”)

 

2、多参数查询

@Query(value="from Customer  c where c.custId=?2 and c.custName=?1")


@Query(value="from Customer  c where c.custId=:#{#custId} and c.custName=:#{#custName}")


@Query(value="from Customer  c where c.custId=:custId and c.custName=:custName")

List<Customer> findCustomersByNameAndIndus(@Param("custName") String name,@Param("custId") Long id);

1234

这几种方式是等价的

  • @Query(value=“from Customer c where c.custId=?2 and c.custName=?1”)
  • @Query(value=“from Customer c where c.custId=:#{#custId} and c.custName=:#{#custName}”)
  • @Query(value=“from Customer c where c.custId=:custId and c.custName=:custName”)

 

3.传对象

这里需要特别注意,可能很多人会写错

传对象的语法是: :#{#对象名称.对象属性} 如下图

@Query(value="from Customer  c where c.custId=:#{#customer.custId}")

Customer findCustomerByInfo(@Param("customer") Customer customer);

 

三、自定义的@Query报异常

org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to use provide names for method parameters. Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters

通过@Query注解返回视图对象列表 :

public interface StudentRepository extends CrudRepository<Student, Integer> {
  @Query(
      "select new com.alphathur.jpademo.model.vo.StudentVo(name, age) from Student where salary = :salary ")
  List<StudentVo> findStudentVo(Double salary);
}

这个接口使用了‘ :参数名’ 来绑定参数,且没有对salary使用@Param参数,所以报错了。

 

解决问题方案:

加上@Param,将接口修改如下:

public interface StudentRepository extends CrudRepository<Student, Integer> {
  @Query(
      "select new com.alphathur.jpademo.model.vo.StudentVo(name, age) from Student where salary = :salary ")
  List<StudentVo> findStudentVo(@Param("salary") Double salary);


相关文章
|
22天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
61 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
100 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
26 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
97 0
|
SQL 监控 druid
全网最详细的SpringBoot学习-day07
全网最详细的SpringBoot学习-day07
123 0
全网最详细的SpringBoot学习-day07
|
运维 Java 测试技术
全网最详细的SpringBoot学习-day04
全网最详细的SpringBoot学习-day04
148 0
全网最详细的SpringBoot学习-day04
|
XML Java 应用服务中间件
全网最详细的SpringBoot学习-day03
全网最详细的SpringBoot学习-day03
177 0
全网最详细的SpringBoot学习-day03
|
开发框架 前端开发 NoSQL
全网最详细的SpringBoot学习-day01
全网最详细的SpringBoot学习-day01
169 0
全网最详细的SpringBoot学习-day01
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
151 1