使用 jpa自定义sql分页,自定义实体类等

在使用 JpaRepository 自定义sql,自定义实体类时,经常会遇到ShardingResultSet.getString null问题,有时可以通过默认值解决,但不能适用所有情况。针对这种情况,建议使用Map<String,Object> 接收查询结果,在通过json转换为对应实体类

一.自定义sql,对应表Entity
下面的代码可以同时实现自定义sql分页

@Query(value = " SELECT  " +
        "  s.*   " +
        "FROM  " +
        "  ( SELECT * FROM table WHERE del = 0 AND owner_id =  (:ownerId) AND provider_id = (:providerId) AND phase = 3 ) p  " +
        "  LEFT JOIN table1  s ON p.station_id = s.id  " +
        "  LEFT JOIN table2  prr ON prr.pile_id = p.pile_id   " +
        "WHERE  " +
        "  prr.pile_state in (:status)   " +
        "GROUP BY  " +
        "  s.id   " +
        "ORDER BY  " +
        "  s.id", nativeQuery = true,

        countQuery="SELECT count(*) FROM ( SELECT  " +
                "  s.*   " +
                "FROM  " +
                "  ( SELECT * FROM table WHERE del = 0 AND value = (:value1) ) p  " +
                "  LEFT JOIN table1  s ON p.station_id = s.id  " +
                "  LEFT JOIN table2  prr prr.pile_run_code = t.pile_code    " +
                "WHERE  " +
                "  prr.pile_state in (:value1)   " +
                "GROUP BY  " +
                "  s.id   " +
                "ORDER BY  " +
                "  s.id) as s")
Page<Entity数据库对应实体> sql(@Param("value1")Integer value1,,Pageable pageable);

二.自定义sql,对应自定义实体类

@Query(value = "SELECT  t.value as value" +
        "    FROM " +
        "            ( SELECT * FROM table" +
        "WHERE del = 0  " +
        "    LEFT JOIN table1 pp ON pp.pile_id =  t.pile_id " +
        "    LEFT JOIN table2 prr ON prr.pile_run_code = t.pile_code  " +
        "            WHERE " +
        "    prr.value IN ( :value ) ", nativeQuery = true)
List<Map<String,Object>> findAllByStationIdAndStatus(@Param("value ") String value );

List<VO实体类> vos =JSON.parseArray(JSON.toJSONString(list),VO实体类.class);

在使用 JpaRepository 自定义sql,自定义实体类时,经常会遇到ShardingResultSet.getString null问题,有时可以通过默认值解决,但不能适用所有情况。针对这种情况,建议使用Map<String,Object> 接收查询结果,在通过json转换为对应实体类. 目前这个问题我一直无法解决,所以使用Map接收在通过json转换绕过这个异常.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于JPA自定义SQL的操作。 在JPA中,可以使用@Query注解来自定义SQL语句。下面是一些常见的JPA自定义SQL操作示例: 1. 查询操作 (1)查询返回单个结果 ``` @Query("select u from User u where u.email = ?1") User findByEmail(String email); ``` (2)查询返回多个结果 ``` @Query("select u from User u where u.age between ?1 and ?2") List<User> findByAgeBetween(int minAge, int maxAge); ``` 2. 更新操作 ``` @Modifying @Query("update User u set u.nickname = ?1 where u.id = ?2") int updateNicknameById(String nickname, Long id); ``` 需要注意的是,执行更新操作时需要使用@Modifying注解标识该方法是修改数据的操作。 3. 删除操作 ``` @Modifying @Query("delete from User u where u.id = ?1") void deleteById(Long id); ``` 同样需要使用@Modifying注解标识该方法是修改数据的操作。 在编写JPA自定义SQL时,需要注意以下几点: 1. JPA自定义SQL语句中的参数占位符使用?号表示,从1开始编号。 2. 如果需要传入多个参数,可以使用@Param注解来指定参数名。例如: ``` @Query("select u from User u where u.name = :name and u.age = :age") List<User> findByNameAndAge(@Param("name") String name, @Param("age") int age); ``` 3. 在执行JPA自定义SQL语句时,需要使用EntityManager对象的createNativeQuery方法或createQuery方法,具体使用哪种方法取决于自定义SQL语句的类型。 以上就是JPA自定义SQL的操作方法,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值