spring data jpa 查询自定义字段,转换为自定义实体(四种方法)

本文介绍了在Spring Boot环境下,使用Spring Data JPA进行数据库查询并转换为自定义JSON格式数据的四种方法,包括直接使用Model、在HQL中构造Map、返回List<Map<String, Object>>以及自定义Repository返回POJO。" 126061587,9990782,揭秘:少儿编程与机器人教育的误区与价值,"['人工智能', '编程教育', '少儿科技', '逻辑思维训练', '未来技能']

目标:查询数据库中的字段,然后转换成 JSON 格式的数据,返回前台。
环境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2
背景:首先建立 entity 映射数据库(非专业 java 不知道这怎么说)

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String userName;    // 账号
    private String password;    // 密码
    // getter setter 方法略过
}

然后建立与之对应的 model

public class UserModel implements Serializable {
    // 一些属性
}
这里我们分情况讨论

首先第一种情况:查询的字段与表中的字段全部对应(就是查表里所有的字段,但是使用 Model 作为接收对象)
这种情况比较简单,调用 Repository 提供的方法,返回一个 entity , 然后将 entity 的属性复制到 model 中。像这样

UserModel user = new UserModel();
User userEntity = new User();
// 一个工具类,具体使用方法请百度
BeanUtils.copyProperties(user, userEntity);

第二种情况:只查询指定的几个字段
现在我有张表,有字段如下:

@Entity
@Table(name = "user_info")
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name = "用户";     // 昵称
    private String signature;         // 个性签名
    private String gender = "未知";   // 性别
    private String description;       // 个人说明
    private String avatar;            // 头像

Spring Data JPA 可通过多种方式实现自定义 Mapper 功能,以下是具体介绍: 1. **继承 JpaRepository 接口**:Spring Data JPA 借助 Repository 简化数据库持久化操作。通常只需定义继承 JpaRepository 的 Dao 层子接口,指定关联操作的实体类型和主键类型(泛型),就能实现对数据库表的操作,甚至无需提供注解。Spring 容器启动时会扫描项目里的所有 Repository 接口,将其注册到 Spring 容器管理,通过动态代理和 AOP 解析执行方法、生成 SQL 语句,利用 EntityManager 执行数据库操作。示例如下: ```java import org.springframework.data.jpa.repository.JpaRepository; public interface IDemoInfoDao extends JpaRepository<DemoInfo, Long> { // 可在此添加自定义方法 } ``` 这种方式下,Spring Data JPA 支持使用保留方法、约定方法命名规则操作数据,也支持原生 SQL、JPQL 操作数据 [^1]。 2. **约定方法命名规则**:能够通过自定义方法名让 JPA 自动解析出相应的 SQL 语句。比如在接口里定义符合特定命名规则的方法Spring Data JPA 会依据方法名自动生成对应的查询逻辑 [^2]。 3. **使用 @Query 注解**:在 Repository 接口的方法上使用 @Query 注解,可自定义 SQL 语句,支持原生 SQL 和 JPQL。示例如下: ```java import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; public interface IDemoInfoDao extends JpaRepository<DemoInfo, Long> { @Query("SELECT d FROM DemoInfo d WHERE d.name = :name") DemoInfo findByName(String name); @Query(value = "SELECT * FROM demo_info WHERE name = :name", nativeQuery = true) DemoInfo findByNameNative(String name); } ``` 4. **自定义更新 SQL 语句**:当仅需修改数据表的某一列数据时,可自定义 SQL 语句实现更新操作。因为 Spring Data JPA 框架没有直接的更新方法,调用 save() 方法会对所有字段进行修改,若不想修改某列数据,该列数据会被默认设为 null 并清空。示例如下: ```java import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.transaction.annotation.Transactional; public interface IDemoInfoDao extends JpaRepository<DemoInfo, Long> { @Modifying @Transactional @Query("UPDATE DemoInfo d SET d.status = :status WHERE d.id = :id") int updateStatusById(Long id, int status); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值