Spring Data JPA 进阶(自定义查询,原生 SQL 查询)

自定义查询语句(JPQL)

使用@Query 自定义查询

//	根据学生姓名查询学生记录 Student是实体类的名称
	@Query("select s from Student s where s.name=?1")
	List<Student> getStudentName(String name);

在controller中调用

/**
	 * 根据学生姓名查询学生记录 http://localhost:8080/getStuName?name=张三
	 * 
	 * @param student * @return
	 */
	@RequestMapping("/getStuName")
	public Object getStudentName(String name) {
		List<Student> student=repository.getStudentName(name);
		return student;
	}
@Query 与 @Modifying 的联合使用

@Transactional 开启事务
@Modifying 识别执行更新操作
@Query() SQL语句
三个主注解缺一不可

//	通过学生id修改学生姓名 三个主注解缺一不可
	@Transactional//开启事务
	@Modifying//识别执行更新操作
	@Query("update Student s set s.name=?1 where s.id=?2")
	int updateStuById(String name, int id);

controller调用

/**
	 * 通过学生id修改学生姓名 http://localhost:8080/updateStuById?name=张3&id=1
	 * 
	 * @param student * @return
	 */
	@RequestMapping("/updateStuById")
	public Object updateStuById(String name,int id) {
		int student=repository.updateStuById(name,id);
		return student;
	}
索引参数与命名参数
  1. 索引参数如下例代码所示,索引值从 1 开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致:
@Transactional
@Modifying
@Query("update Student s set s.studentName=?1 where s.studentId=?2")
int setFixedStudentNameFor(String studentName,int studentId);

2)命名参数(推荐使用这种方式) 可以定义好参数名,赋值时采用@Param(“参数名”),而不用管顺序。
3) 在 StudentRepository 里添加如下代码,实现姓名的模糊查询:

@Query("select s from Student s where s.studentName like %:studentName% ")
List<Student> queryByname(@Param(value = "studentName") String studentName);

在 controller 里面进行调用,代码如下:

/***
* http://localhost:8080/queryByname?name=刘
* @param name * @return
*/
@RequestMapping("/queryByname")
public Object queryByname(String name) {
List<Student> student = repository.queryByname(name);
return student;
}

原生 SQL 查询

nativeQuery=true 开启原生SQL

//利用原生的 SQL 进行查询操作
@Query(value = "select s.* from studenttb s where s.student_name=?1", nativeQuery = true)
public List<Student> findStudentByName(String name);

//利用原生的 SQL 进行删除操作
@Query(value = "delete from studenttb where student_id=?1 ", nativeQuery = true)
@Modifying
@Transactional
public int deleteStudentById(int uid);

//利用原生的 SQL 进行修改操作
@Query(value = "update studenttb set student_name=?1 where student_id=?2 ", nativeQuery = true)
@Modifying
@Transactional
public int updateStudentName(String name,int id);

//利用原生的 SQL 进行插入操作
@Query(value = "insert into studenttb(student_name,student_age) value(?1,?2)", nativeQuery = true)
@Modifying
@Transactional
public int insertStudent(String name,int age);

//利用原生的 SQL 实现姓名的模糊查询
@Query(value=" SELECT * FROM studenttb WHERE STUDENT_NAME LIKE %:name% ",nativeQuery=true)
List<Student> queryBynameSQL(@Param(value = "name") String name);

controller调用

//原生 sql 的调用
/***
*查询学生
* http://localhost:8080/findStudentByName?name=刘一
* @param name * @return
*/
@RequestMapping("/findStudentByName")
public Object findStuByName(String name) {
List<Student> student = repository.findStudentByName(name);
return student;
}

/***
*删除学生
* http://localhost:8080/deleteStudentById?id=刘
* @param name * @return
*/
@RequestMapping("/deleteStudentById")
public Object deleteStudentById(int id) {
int i = repository.deleteStudentById(id);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}

/***
* 修改学生名字
*http://localhost:8080/updateStudentName?name=Tom&id=1
* @param name * @return
*/
@RequestMapping("/updateStudentName")
public Object updateStudentName(String name,int id) {
int i = repository.updateStudentName(name,id);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}

/***
*添加学生信息
* http://localhost:8080/insertStudent?name=xiao&age=18
129
* @param name * @return
*/
@RequestMapping("/insertStudent")
public Object insertStudent(String name,int age) {
int i = repository.insertStudent(name,age);
Map<String,Object> map=new HashMap<String,Object>();
if(i>0) {
map.put("success", true);
}else {
map.put("success", false);
}
return map;
}

/***
* 模糊查询
* http://localhost:8080/queryBynameSQL?name=刘
* @param name * @return
*/
@RequestMapping("/queryBynameSQL")
public Object queryBynameSQL(String name) {
List<Student> student= repository.queryBynameSQL(name);
return student;
}

JAP 动态 SQL 查询

JpaSpecificationExecutor 接口中的所有功能

  1. T findOne(Specification spec);// 查询单个对象
  2. List findAll(Specification spec);//查询列表
  3. Page findAll(Specification spec, Pageable pageable); //分页查询列表,pageable:分页参数。
  4. List findAll(Specification spec, Sort sort); //排序查询列表,Sort:排序参数
  5. long count(Specification spec);//统计查询

在上面的所有方法中,都有 Specification 对象,它是查询条件对象,需要自定义自己的 Specification 实现类,需要实现如下的方法:
Predicate toPredicate(Root root, CriteriaQuery<?> query, CriteriaBuilder cb);

controller 实现多条件查询

/**
	 * 多条件分页查询分页查询 http://localhost:8080/page/limit
	 * 
	 * @param student * @return
	 */
	@RequestMapping("/page/limit")
	public Object getPageLimit() {
		Integer limit=10;
		Integer index=1;
		String name="张3";
		PageRequest page=PageRequest.of(index-1, limit);
		Specification<Student> spec=new Specification<Student>() {

			@Override
			public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
				// TODO Auto-generated method stub
				Predicate pc=criteriaBuilder.conjunction();
				List<Expression<Boolean>> es=pc.getExpressions();
				es.add(criteriaBuilder.like(root.get("name"), "%"+name+"%"));
				return pc;
			}
		};
		return repository.findAll(spec, page);
	}

StudentRepository接口需要继承的

//接口 StudentRepository,并继承 JpaRepository 接口	JpaSpecificationExecutor接口
public interface StudentRepository extends JpaRepository<Student, Integer>,JpaSpecificationExecutor<Student>
### 配置 Windows 沙盒环境 #### 创建并编辑 .wsb 文件 为了配置 Windows 沙盒,可以通过创建 `.wsb` 文件来实现自定义设置。此文件采用 XML 格式编写,并允许指定启动时加载的应用程序和其他初始条件[^4]。 ```xml <?xml version="1.0"?> <SandboxConfiguration xmlns="http://schemas.microsoft.com/sandbox/2019/configuration"> <Name>MyCustomSandbox</Name> <Description>A sandbox with custom configurations.</Description> <AllowedPaths> <Path>C:\Temp\Scripts</Path> </AllowedPaths> <MappedFolders> <MappedFolder> <HostPath>C:\Projects</HostPath> <ReadOnly>false</ReadOnly> </MappedFolder> </MappedFolders> <LogonCommand> <Command>powershell.exe -NoExit Start-Process notepad</Command> </LogonCommand> </SandboxConfiguration> ``` 上述代码片段展示了如何映射主机上的文件夹到沙箱环境中以及在启动时运行特定命令。这使得开发者可以在隔离环境下测试应用程序而不会影响主操作系统。 #### 使用预设模板快速部署 对于希望简化流程的用户来说,微软提供了几种内置模板供选择。只需下载相应的`.wsb`文件即可立即应用所需设定而不必手动编码。 #### 自定义网络连接选项 除了基本路径映射外,还能够调整联网属性以适应不同场景需求。例如,在某些情况下可能需要断开互联网访问权限从而增强安全性;而在另一些时候则需模拟真实世界中的DNS解析过程以便更准确地评估目标软件的行为表现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值