springboot系列09:jpa的高级使用2
限制查询
-
查询取前一个实体
/**
* 取年龄最大 */ User findTopByOrderByAgeDesc();
-
测试类
@Test
public void testFindTopByOrderByAgeDesc(){
Assert.assertEquals(30,(int)userRepository.findTopByOrderByAgeDesc().getAge());
}

自定义查询
使用自定义的 SQL 来查询,在 SQL 的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等
-
更新语句
/**
* 更新用户名
*/
@Transactional
@Modifying
@Query("update com.example.jpa.domain.User u set u.userName = ?1 where u.id = ?2")
int updateUserNameById(String userName, Long id);
-
测试类
@Test
public void testUpdateUserNameById(){
Assert.assertEquals(1,userRepository.updateUserNameById("zhangliang",12L));
}

-
自定义查询
/**
* 用户名模糊查询
*/
@Query("select u from com.example.jpa.domain.User u where u.userName like ?1")
List<User> findByUserNameLike(String userName);
-
测试
@Test
public void testFindByUserNameLike(){
Assert.assertEquals(2,userRepository.findByUserNameLike("%zhang%").size());
}

-
删除
/**
* 删除
*/
@Transactional
@Modifying
@Query("delete from com.example.jpa.domain.User where id = ?1")
int deleteByUserId(Long id);
-
测试
@Test
public void testDeleteByUserId(){
Assert.assertEquals(0,userRepository.deleteByUserId(0L));
}

多表查询
第一种利用 Hibernate 的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果
第一种实现:
-
定义爱好类,实现一个用户有多个爱好
package com.example.jpa.domain;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Entity(name = "tb_hobby")
public class Hobby implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, unique = true)
private String name;
}
-
用户类添加映射关系
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="user_id",referencedColumnName="id")
private List<Hobby> hobbies;
-
自定义查询
@Query("select u from com.example.jpa.domain.User u where u.id=?1")
User findUserHobby(Long id);
-
测试
@Test
public void testFindUserHobby(){
Assert.assertEquals(2,userRepository.findUserHobby(1L).getHobbies().size());
}


浙公网安备 33010602011771号