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);


相关文章
|
12天前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
2月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
233 12
|
2月前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
97 10
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
137 5
|
2月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
49 5
|
2月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
73 9
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
46 9
|
2月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
36 0
|
3月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
30 1

热门文章

最新文章