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号
浙公网安备 33010602011771号