Spring Data JPA方法名命名规则
最近巩固一下JPA,网上看到这些资料,这里记录巩固一下。
一、Spring Data Jpa方法定义的规则
简单条件查询
简单条件查询:查询某一个实体类或者集合。
按照Spring Data的规范的规定,查询方法以find | read | get开头(比如 find、findBy、read、readBy、get、getBy),涉及查询条件时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,即不用写SQL,目前支持的关键字写法如下:


二、只有查询参数
定义一个Entity实体类:
class People{private String firstName;private String lastName;
}
以上使用and条件查询时,应这样写
findByLastNameAndFirstName(StringlastName,String firstName);
注意:条件的属性名称与个数要与参数的位置与个数一一对应
三、查询同时排序
如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询比如
Page findByName(String name, Pageable pageable);List findByName(String name, Sort sort);
排序也可以这么写
List<Cus> findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)
List<Cus> findBySexOrderByNameAsc(String sex); //名称正序(效果同上)
List<Cus> findBySexOrderByNameDesc(String sex); //名称倒序
四、查询参数是 对象里面的对象的属性
如,查询参数是ERole.EMemberAccount.memberCode 一般我们会这么写
@Query("select e from ERole e where e.memberAccount.memberCode = ?1")List<ERole> findByMerchantCode(String merchantCode);
如果用命名规则可以这么写
List<ERole> findByMemberAccountMemberCode(String merchantCode);
查询方法解析流程
假如我们创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc。
-
先判断userDepUuid (根据POJO(Plain Ordinary Java Object简单java对象,实际就是普通java bean)规范,首字母变为小写。)是否是查询实体的一个属性,如果根据该属性进行查询;如果没有该属性,继续第二步。
-
从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user为查询实体的一个属性。
-
接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进行查询。
-
可能会存在一种特殊情况,比如 Doc包含一个user的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_"以显式表达意图,比如"findByUser_DepUuid()" 或者"findByUserDep_uuid()"。
五、命名规则不适合动态查询
当查询条件为null时,如
- 实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。
- 查询方法定义:List<Cus> findByNameAndSex(String name,String sex);
- 使用时:dao.findByNameAndSex(null, "男");
- 后台生成sql片断:where (cus0_.name is null) and cus0_.sex=?
结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。
强调:需要强调的是,命名规则也不适合delete insert update. 只适合简单查询
六、Spring Data JPA对多表查询的选择
答案是肯定的,直接上结论。
| 方案 | 说明 | 自定义接收对象 | SQL | 分页 | 多表联合 | 问题 |
|---|---|---|---|---|---|---|
| 方案一 | @Query | JPQL:DTO或投影原生SQL:Object[],map(2个字段时) | JPQL或原生SQL | JpaRepository | 实体上配不配关系都可以 | 1.查询条件要嵌入SQL语句内,一些复杂的情形不好处理,例如某个字段模糊检索,字段是动态的;2.分页查询countQuery把查询语句重复了一遍 |
| 方案二 | Specification | 不支持,只能返回对应PO | 无SQL | 结合JpaRepository | 需要在实体上配置关系,如@OneToOne,否则无法实现左连接,只能联合查询 | 1.实体需要配置连接关系2.每一个关联对象都是单独的数据库查询 |
| 方案三 | EntityManager | 不支持投影,其他同@Query | JPQL或原生SQL | 自己封装 | 实体上配不配关系都可以 | 相比于@Query好处是,JPQL字符串可以动态拼接,可以处理一些复杂的查询情形。但是分页需要自己封装。 |
| 方案四 | CriteriaQuery | DTO | 无SQL | 自己封装 | 需要在实体上配置关系,如@OneToOne否则无法实现左连接,只能联合查询 | 同Specification,且分页需要自己封装 |
| 终极方案 | QueryDSL | DTOTuple | 无SQL | 支持 | 实体上配不配关系都可以 | 解决以上所有问题 |
选择一个好的解决方案,需要考虑如下几个方面:
- 能够自定义对象接收查询结果集;
- 能够支持复杂的、动态的查询条件;
- 既然使用JPA,当然最好能够用类型安全的查询方式,并且使用起来比较自然;
- 能够原生支持分页查询;
- 能够支持left join,并且对实体定义没有约束。
上表就是从这几个方面进行分析,最后QueryDSL堪称完美,下面详细介绍几种方案。
示例代码:GitHub - zhongpan/jpa-demo
七、JPA、Hibernate、Spring Data JPA三者的关系
先了解下JPA、Hibernate、Spring Data JPA三者的关系是什么?
JPA是一个接口规范,随着Java EE 5发布,也是EJB3.0的一部分。Hibernate是先于JPA出现的一种历史悠久的ORM框架,它实现了JPA,也是目前用的最多的实现。而Sprint Data JPA是Spring中提供的开箱即用的基于JPA的数据库访问框架,其采用的实现正是Hibernate。Spring Data JPA提供的数据库访问能力如下:

从上述接口的名字就可以看出:
- CrudRepository:最基本的增删改查操作
- PagingAndSortingRepository:分页查询
- QueryByExampleExecutor:基于样本查询,避免了传一堆参数,还要判断是否null
- JpaSpecificationExecutor:基于Specification查询,就是对CriteriaQuery的封装,类型安全的查询方式
- QuerydslPredicateExecutor:基于QueryDSL的查询,也是类型安全的
上述接口的实现在SimpleJpaRepository和QuerydslJpaPredicateExecutor中,其中就是基于JPA的EntiryManager接口进行封装。如果我们要重写实现,也是通过EntiryManager来完成。
方案一
首先想到的方法自然是使用@Query注解,直接使用JPQL进行联合查询,自定义接收对象,left join都不在话下。主要的问题是对于一些复杂的、动态的查询条件不好处理,另外分页的countQuery不得不把主查询重写一遍,有点烦人。
@Repository
public interface VmhostDao extends JpaRepository<VmhostPO, String> {// 方法一:使用@Query注解,可以自定义接收对象// 问题:查询条件要嵌入SQL语句内,一些复杂的情形不好处理,例如某个字段模糊检索,字段是动态的;分页查询countQuery把查询语句重复了一遍@Query("select new com.example.demo.entity.VmhostDTO(v, u, t) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %?1%")List<VmhostDTO> findVmhost(String name);@Query("select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%")List<VmhostInfoDTO> findVmhostInfo(String name);@Query("select v.id as id, v.name as name, u.username as userName, t.name as tname from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id")List<VmhostInfoByProjection> findVmhostInfoByProjection();@Query(value = "select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%", countQuery = "select count(*) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like %:name%")Page<VmhostInfoDTO> findVmhostInfoByPage(String name, Pageable pageable);}
|
方案二
那么SQL的组织能否动态编程控制呢,自然会想到Specification查询,查询条件可以通过CriteriaQuery动态拼装。这也是Spring Data JPA中用的最广泛的查询方式。
但是这种方式存在一些限制,首先不能灵活自定义接收对象,只能返回PO,其次要想实现left join,必须在实体上定义关系,最后关联对象不是一次查询回来的,而是单独的查询。
public interface VmhostSpecWithRelationDaoextends JpaRepository<VmhostWithRelationPO, String>, JpaSpecificationExecutor<VmhostWithRelationPO> {// 方案二:使用Specification查询// 问题:实体必须配置关系,否则无法左连接;每个关联对象是单独数据库查询
}package com.example.demo.service;@Service
public class VmhostService {public List<VmhostWithRelationPO> listVmhostSpecWithRelation(String name) {Specification<VmhostWithRelationPO> spec = (root, cq, cb) -> {root.join("user", JoinType.LEFT);root.join("tenant", JoinType.LEFT);return cb.like(root.get("name"), "%" + name + "%");};List<VmhostWithRelationPO> list = vmhostSpecWithRelationDao.findAll(spec);return list;}}
|
可能大家有两点疑问:
- @Query和Specification能否混用,@Query定义select的结果,Specification定义查询条件
答案:不行,总是@Query有效,你定义的Specification参数压根就不会理会
// JpaSpecificationExecutor的参数和JpaRepository不一样,没啥用,SimpleJpaRepository总是用的JpaRepository的参数
public interface VmhostSpecDao extends JpaRepository<VmhostPO, String>, JpaSpecificationExecutor<VmhostInfoDTO> {// 方案二:@Query和Specification是不能混用的,也无法改变接收结果集对象// 无法混用,总是query有效,spec参数压根就不会理会@Query("from VmhostPO")List<VmhostPO> findVmhost(Specification<VmhostPO> spec);// 覆盖JpaSpecificationExecutor的方法可以吗?一样的,根本不会走到findAll的默认实现 @Override@Query("select new com.example.demo.entity.VmhostInfoDTO(v.id, v.name, u.username, t.name) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id")List<VmhostInfoDTO> findAll(Specification<VmhostInfoDTO> spec);
}
|
- Specification控制接收结果集对象
答案:对不起,Specification的toPredicate中执行select是无效的,里面只能返回查询条件。
// 这样写没有用,生成如下sql// select vmhostpo0_.id as id1_2_, vmhostpo0_.addresses as addresse2_2_, vmhostpo0_.availablezone as availabl3_2_, vmhostpo0_.baremetal as baremeta4_2_, vmhostpo0_.cpucore as cpucore5_2_, vmhostpo0_.createtime as createti6_2_, vmhostpo0_.disksize as disksize7_2_, vmhostpo0_.floatip as floatip8_2_, vmhostpo0_.hostname as hostname9_2_, vmhostpo0_.locked as locked10_2_, vmhostpo0_.metadata as metadat11_2_, vmhostpo0_.name as name12_2_, vmhostpo0_.privatenetworkid as private13_2_, vmhostpo0_.ramsize as ramsize14_2_, vmhostpo0_.tenantid as tenanti15_2_, vmhostpo0_.tenantname as tenantn16_2_, vmhostpo0_.type as type17_2_, vmhostpo0_.userid as userid18_2_, vmhostpo0_.username as usernam19_2_, vmhostpo0_.vmstatus as vmstatu20_2_ from vmhost vmhostpo0_ cross join auth_user authuserpo1_ cross join auth_tenant authtenant2_ where vmhostpo0_.userid=authuserpo1_.id and vmhostpo0_.tenantid=authtenant2_.id and (vmhostpo0_.name like ?)
public Optional<VmhostInfoDTO> listVmhostSpec(String name) {Specification<VmhostInfoDTO> spec = (root, cq, cb) -> {// 只能cross join,要left join需要在实体上建立关系Root<AuthUserPO> user = cq.from(AuthUserPO.class);Root<AuthTenantPO> tenant = cq.from(AuthTenantPO.class);// 这里执行select没有用,这个函数只能返回查询条件,外层会覆盖selectcq.multiselect(root.get("id"), root.get("name"), user.get("username"), tenant.get("name"));return cb.and(cb.equal(root.get("userid"), user.get("id")), cb.equal(root.get("tenantid"), tenant.get("id")),cb.like(root.get("name"), "%" + name + "%"));};return vmhostSpecDao.findOne(spec);
}
|
因为SimpleJpaRepository的实现已经固定了select,跟JpaRepository的类型参数相关,跟JpaSpecificationExecutor的类型参数无关
protected <S extends T> TypedQuery<S> getQuery(@Nullable Specification<S> spec, Class<S> domainClass, Sort sort) {CriteriaBuilder builder = em.getCriteriaBuilder();CriteriaQuery<S> query = builder.createQuery(domainClass);Root<S> root = applySpecificationToCriteria(spec, domainClass, query);query.select(root);if (sort.isSorted()) {query.orderBy(toOrders(sort, root, builder));}return applyRepositoryMethodMetadata(em.createQuery(query));
}
|
方案三
上面两种使用方法是Spring Data JPA用的最多的,接下来只能从底层入手,直接使用EntiryManager。这种方法完全靠自己,所有接口都需要自己实现,丧失了Spring Data JPA的便利性。
@Repository
public class VmhostEMDao {@Autowired@PersistenceContextprivate EntityManager entityManager;// 方案三:使用原生的entityManager,解决@Query的SQL无法动态拼接问题// 此时分页就需要自己封装了,也没有了JPA自动实现的接口// 注意这里like后面要引号@SuppressWarnings("unchecked")public List<VmhostDTO> findVmhost(String name) {List<VmhostDTO> list = entityManager.createQuery("select new com.example.demo.entity.VmhostDTO(v, u, t) from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id where v.name like '%"+ name + "%'").getResultList();return list;}@SuppressWarnings("unchecked")public List<VmhostInfoByProjection> findVmhostInfoByProjection() {// 此时总是Object[],不支持投影List<VmhostInfoByProjection> list = entityManager.createQuery("select v.id as id, v.name as name, u.username as userName, t.name as tname from VmhostPO v left join AuthUserPO u on v.userid = u.id left join AuthTenantPO t on v.tenantid = t.id").getResultList();return list;}}
|
方案四
类似于方案二之于方案一,我们也可以使用类型安全的查询方式CriteraQuery。
@Repository
public class VmhostCQDao {@Autowired@PersistenceContextprivate EntityManager entityManager;// 方案四:相对于方案三,使用了类型安全的CriteriaQuery,其实Specification也是用的CriteriaQuery,所以存在和Specification一样的限制,但是可以控制select了,比Specification灵活一点public List<VmhostDTO> findVmhost(String name) {CriteriaBuilder builder = entityManager.getCriteriaBuilder();CriteriaQuery<VmhostDTO> query = builder.createQuery(VmhostDTO.class);// 实体上没有配置关系,无法使用left join,只能联合查询(inner join)Root<VmhostPO> root = query.from(VmhostPO.class);Root<AuthUserPO> rootUser = query.from(AuthUserPO.class);Root<AuthTenantPO> rootTenant = query.from(AuthTenantPO.class);query.multiselect(root, rootUser, rootTenant).where(builder.equal(root.get("userid"), rootUser.get("id")),builder.equal(root.get("tenantid"), rootTenant.get("id")), builder.like(root.get("name"), "%" + name + "%"));List<VmhostDTO> list = entityManager.createQuery(query).getResultList();return list;}}
|
终极方案
到了终极方案了,Spring Data JPA集成了对QueryDSL的支持,官方参考见:http://www.querydsl.com/static/querydsl/latest/reference/html_single。
是不是有点像方案二+方案四,单表的时候直接使用JpaRepository和QuerydslPredicateExecutor提供的默认实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com.example.demo.dao;import com.example.demo.entity.VmhostPO;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;public interface VmhostQDSLDaoextends JpaRepository<VmhostPO, String>, QuerydslPredicateExecutor<VmhostPO>, VmhostRepository {// 方案五:VmhostRepository使用原生的entityManager配合QueryDSL,完美解决所有问题// 对于单表也可以使用QuerydslPredicateExecutor,自动拥有默认实现}
|
多表的时候就基于EntityManager扩展,但是querydsl已经帮我们做了很多工作,不是从头开始。querydsl的书写方式相对于CriteriaQuery也更加自然,易于理解。
1 2 3 4 5 6 7 | @NoRepositoryBean
public class BaseRepository {@PersistenceContextprotected EntityManager em;}
|
1 2 3 4 5 6 7 | public interface VmhostRepository {public List<VmhostDTO> findVmhost(Predicate predicate);public QueryResults<VmhostDTO> findVmhostByPage(Predicate predicate, Pageable pageable);}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | @Repository
public class VmhostRepositoryImpl extends BaseRepository implements VmhostRepository {// 多表左连接@Overridepublic List<VmhostDTO> findVmhost(Predicate predicate) {JPAQueryFactory queryFactory = new JPAQueryFactory(em);JPAQuery<VmhostDTO> jpaQuery = queryFactory.select(Projections.constructor(VmhostDTO.class, QVmhostPO.vmhostPO, QAuthUserPO.authUserPO,QAuthTenantPO.authTenantPO)).from(QVmhostPO.vmhostPO).leftJoin(QAuthUserPO.authUserPO).on(QVmhostPO.vmhostPO.userid.stringValue().eq(QAuthUserPO.authUserPO.id.stringValue())).leftJoin(QAuthTenantPO.authTenantPO).on(QVmhostPO.vmhostPO.tenantid.stringValue().eq(QAuthTenantPO.authTenantPO.id.stringValue()));jpaQuery.where(predicate);return jpaQuery.fetch();}@Overridepublic QueryResults<VmhostDTO> findVmhostByPage(Predicate predicate, Pageable pageable) {JPAQueryFactory queryFactory = new JPAQueryFactory(em);JPAQuery<VmhostDTO> jpaQuery = queryFactory.select(Projections.constructor(VmhostDTO.class, QVmhostPO.vmhostPO, QAuthUserPO.authUserPO,QAuthTenantPO.authTenantPO)).from(QVmhostPO.vmhostPO).leftJoin(QAuthUserPO.authUserPO).on(QVmhostPO.vmhostPO.userid.stringValue().eq(QAuthUserPO.authUserPO.id.stringValue())).leftJoin(QAuthTenantPO.authTenantPO).on(QVmhostPO.vmhostPO.tenantid.stringValue().eq(QAuthTenantPO.authTenantPO.id.stringValue())).offset(pageable.getOffset()).limit(pageable.getPageSize());jpaQuery.where(predicate);return jpaQuery.fetchResults();}}
|
总结
以上方法都还是在Spring Data JPA框架之内,如果你愿意,你也可以去重写SimpleJpaRepository,重写了注意通过如下注解启用。
1 | @EnableJpaRepositories(repositoryBaseClass = XXXXXX.class) |
其实QueryDSL已经做了很好的封装,完全没有必要重复造轮子,Spring Data JPA也提供了很多扩展点,在保留其便利性的基础上,根据需要去扩展,不需要全部推倒重来。
参考:
Spring Data JPA方法名命名规则 - 简书
Spring Data JPA中多表联合查询最佳实践 | 钟潘的博客
相关文章:
Spring Data JPA方法名命名规则
最近巩固一下JPA,网上看到这些资料,这里记录巩固一下。 一、Spring Data Jpa方法定义的规则 简单条件查询 简单条件查询:查询某一个实体类或者集合。 按照Spring Data的规范的规定,查询方法以find | read | get开头&…...
【Leetcode Sheet】Weekly Practice 15
Leetcode Test 2586 统计范围内的元音字符串数(11.7) 给你一个下标从 0 开始的字符串数组 words 和两个整数:left 和 right 。 如果字符串以元音字母开头并以元音字母结尾,那么该字符串就是一个 元音字符串 ,其中元音字母是 a、e、i、o、u…...
人力资源社会保障部办公厅关于推行专业技术人员职业资格电子证书的通知
(人社厅发〔2021〕97号) 各省、自治区、直辖市及新疆生产建设兵团人力资源社会保障厅(局),中共海南省委人才发展局,国务院有关部门、直属机构人事部门,有关协会、学会: 为贯彻落实…...
什么是光电耦合器?如何选择型号及种类
光电耦合器(英文缩写为OC)亦称光电隔离器,简称光耦;以光为媒介传输电信号;它对输入、输出电信号有良好的隔离作用,是目前种类最多、用途最广的光电器件之一;所以,它在各种电路中得到广泛的应用。 光耦合器…...
hive里因为列名用了关键字导致建表失败
代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …...
MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00‘ for column
使用navicat导入数据时报错: MySQL 报错 incorrect datetime value ‘0000-00-00 00:00:00’ for column 这是因为当前的MySQL不支持datetime为0的情况。 MySQL报incorrect datetime value ‘0000-00-00 00:00:00’ for column错误原因,是由于在MySQL5.7…...
Jira Data Center(非集群)升级操作
一、升级准备 Jira 管理界面执行升级检查下载升级包,使用原操作方式相同的方式安装。我这里原来的版本是通过./atlassian-jira-software-9.11.2-x64.bin安装的,接下来下载atlassian-jira-software-9.11.3-x64.bin的安装文件停止 Jira,bin/st…...
Spring IOC - BeanDefinition解析
1. BeanDefinition的属性 BeanDefinition作为接口定义了属性的get、set方法。这些属性基本定义在其直接实现类AbstractBeanDefinition中,各属性的含义如下表所示: 类型 名称 含义 常量 SCOPE_DEFAULT 默认作用域:单例模式 AUT…...
ds前后台博客系统
源码私信或者公众号java大师获取 博客简介:本博客采用Spring Boot LayUI做为基础,进行的博客系统开发,与bootvue相比,更为适合开发简单的系统,并且更容易上手,简单!高效!更易上手&a…...
算法leetcode|88. 合并两个有序数组(rust重拳出击)
文章目录 88. 合并两个有序数组:样例 1:样例 2:样例 3:提示: 分析:题解:rust:go:c:python:java: 88. 合并两个有序数组: …...
GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲
这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对,似乎没写错误处理的文章。后面补上。 首先&…...
猪酒店房价采集
<?php // 设置代理 $proxy_host jshk.com.cn;// 创建一个cURL资源 $ch curl_init();// 设置代理 curl_setopt($ch, CURLOPT_PROXY, $proxy_host.:.$proxy_port);// 连接URL curl_setopt($ch, CURLOPT_URL, "http://www.zujia.com/");// 发送请求并获取HTML文档…...
Java基础知识第四讲:Java 基础 - 深入理解泛型机制
Java 基础 - 深入理解泛型机制 背景:Java泛型这个特性是从JDK 1.5才开始加入的,为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”࿰…...
ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设备rbd 测试失败
上篇 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 安装vdbench 下载vdbench 下载页面 Vdbench Downloads (oracle.com) 包下载 需要账号登录,在弹出层点击同意才能继续下载 用户手册 https://download.oracle.com/otn/utilities_drivers/vdbench/vdb…...
split_train_val
# coding:utf-8 import os import random import argparse parser argparse.ArgumentParser() # xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下 parser.add_argument(--xml_path, defaultdata_door_white/xml/train, typestr, helpinput xm…...
Linux Mint 21.3 将搭载 Cinnamon 6.0 和实验性 Wayland 支持
导读Wayland 会话可能在 Linux Mint 23 系列中成为默认选项,预计将在 2026 年实现。 Linux Mint 项目今天在他们的每月新闻通讯中 宣布,他们已经开始着手在未来的 Linux Mint 发行版中实施 Wayland 会话,最初将在 Linux Mint 21.3 中提供。 …...
名师助阵龙讯旷腾PWmat+半导体缺陷培训暨半导体缺陷计算大赛
半导体缺陷计算大赛 选拔赛截止日期:11月23日 参与杭州线下培训直接跳过选拔赛 大赛亮点 线上免费培训、线下限时领取免费名额 线下杭州培训可直通决赛,跳过选拔赛 线上培训有3次机会参与考试进入决赛 已购/未购用户均可参加、无身份限定 使用Mc…...
Kotlin与Java写法的变更
目录 获取类的Java Class属性 类型检查 for循环 switch语句 if判断 获取类的Java Class属性 //Java Intent intent new Intent(this, MainActivity.class);//Kotlin val intent Intent(this, MainActivity::class.java) 类型检查 //Java apple instanceof Fruit !(app…...
京东数据软件系统:京东销量和销额数据在哪里看?
京东平台店铺众多,行业同行也数不胜数,若想要在平台中更好的运营店铺,品牌需要做好数据分析。下面结合鲸参谋电商数据分析平台这一数据分析工具,我们来看一看品牌在做数据分析时需要注重哪些数据维度。 *行业数据 京东商家通过鲸…...
美观且功能丰富的控制台:5个.Net开源项目
今天一起盘点下,9月份推荐的5个.Net开源项目(点击标题查看详情)。 1、FTP开源库 FluentFTP是一个基于.Net开发的,可用于FTP和FTPS文件传输。该项目优化了速度,并提供简单易用的API,让开发人员可以快速地集…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
