Spring Boot开发中Jpa相关内容

标签: Springboot 分类: Java 创建时间:2020-01-15 11:06:15 更新时间:2024-11-15 10:49:43

1.sort排序出现了首字母小写的问题

在使用jpa进行分页查询的时候,需要传入一个Sort对象,这个Sort对象接受一个参数properties,指定所要排序的字段。

1
2
3
4
5
6
7
8
9
10
 @Autowired
private SiteinfoRepo siteinfoRepo;
// 获取全部站点信息
@RequestMapping(value = "/getAll")
public Page<SiteInfo> getAll(){

PageRequest pageable=new PageRequest(0, 10, new Sort(Sort.Direction.DESC,"SiteNo"));

return siteinfoRepo.findAll(pageable);
}

我这里写了SiteNo,但是在执行这个方法时,出现了错误:没有这个属性。

而且我明明配置了命名规则:

在实体类中也添加了相应的属性

2.findOne

Jpa中可以使用findAll()返回List类型的列表,但是如果要获取一个怎么办呢?findById?还有一个是findOne()函数。

这个findOne函数的参数有点奇怪。

1
2
3
4
Config config=new Config();
config.setId(1);
Example<Config> configExample=Example.of(config);
config=configRepo.findOne(configExample).get();

还不如直接getOne()来的实在,一句话就搞定了。

1
Config c=configRepo.getOne(1L);

3.RecordTime问题

我的数据库中数据表有一个字段名为RecordTime

所以我的实体类中也有一个RecordTime

但是我使用jpa进行查询的时候,最后却没有这个属性,有出现了一个recordTime属性。

最后的解决方法,添加了一个@Column注解

1
2
3
@Column(name = "RecordTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date RecordTime;

但是这个recordTime还是存在。

4.jpa返回的数据相同

第一种方法,尽量讲@Id注解到不重复的字段上

使用jpa查询数据的时候,返回的内容都是相同的。

我的数据库中没有主键,但是我又不能在数据库中添加主键。

解决方法,添加一个空的主键,但是这个@Id注解最好注解到一个很少重复的属性上,否则也会出现查询的数据都是相同的。如下图,当我注解到sectionId上,那么查询出的数据都是重复的。

注解到RecordTime上,就会出现的数据全部都是重复的,但是无论是sectionId和RecordTime都不是主键。

sectionId和RecordTime都有部分的重复,但是RecordTime的重复率较低。

参考文章:
1.jpa查询数据长度正常,内容都是重复的,mysql数据库运行查询语句结果正常
2.JPA查询List ID相同导致 返回List与数据库查询结果不一致 的问题 (当我完成了第二种方法,再回过头来看这篇文章,终于理解了其中的方法,我的方法是使用的自动生成的行号,但是这篇文章使用的是最大id的方法,我觉得原理也都是差不多的)
3.hibernate 无主键表映射
4.没有主键的表的JPA实体
5.jpa查询记录重复 (这里提到了会不会是主键的问题,我查询了自己的数据库,确实没有主键)
6.java - JPA / Hibernate select查询返回重复记录 (这篇文章讲了是因为@Id属性放置错误)
7.JPA Primary Key (这里讲了主键的类型有哪些)
8.Spring data jpa 查询出来的数据总是重复
9.java-没有ID的JPA实体 (这个也没有说明白,明明没有主键,他还猜有一个复合主键,不是我们需要的解决方案)
10.JPA entity for a table without primary key (这里提到的问题倒是很像我的,但是回答问题的人总是答不到电子上,说什么查询的时候不影响之类的,但是我的明明就已经影响了啊。)
11.Hibernate and UUID identifiers (这个有点没看懂,这是讲如何生成uuid为主键的方法吗)

修改查询语句,自动生成一个id

可以修改查询语句,自动生成一个id。我数据库中没有id字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 实体类
@Entity
@Table(name = "secHis")
//@IdClass(SecHisMultiKeysClass.class)
public class SecHis implements Serializable {

@Id
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}

查询语句,使用原生的sql查询,生成一个id号,或者是使用newId()函数生成uuid,但是这样的问题,就是会出现查询时很慢的情况。

1
2
3
4
5
6
7
8
9
public interface SecHisRepository extends JpaRepository<SecHis,Long> {

@Query(value="select row_number() over (order by RecordTime ) as id, * from secHis t",nativeQuery=true)
List<SecHis> findBySectionIdAndRecordTimeBetween(Integer section, Date starttime, Date endtime);

@Query(value="select newId() as id, * from secHis t",nativeQuery=true)
List<SecHis> findBySectionId(Integer sectionId);

}
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。