springboot系列09:jpa的高级使用2

限制查询

  • 查询取前一个实体

     
/**
   * 取年龄最大 */ User findTopByOrderByAgeDesc();

 

  • 测试类

   @Test
    public void testFindTopByOrderByAgeDesc(){
        Assert.assertEquals(30,(int)userRepository.findTopByOrderByAgeDesc().getAge());
    }

springboot系列09:jpa的高级使用2

 

 

自定义查询

使用自定义的 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));
    }

 

springboot系列09:jpa的高级使用2

 

 

  • 自定义查询

    /**
     * 用户名模糊查询
     */
    @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());
    }

 

springboot系列09:jpa的高级使用2

 

 

 

  • 删除

    /**
     * 删除
     */
    @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));
    }

 

 

springboot系列09:jpa的高级使用2

 

多表查询

第一种利用 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());
    }

 

springboot系列09:jpa的高级使用2

 

上一篇:Java5 枚举类型使用总结


下一篇:Flowable实战(六)集成JPA