Spring Data JPA的使用。

1, @Query 的使用

@Repository
public interface PostRepository extends JpaRepository<PostEntity, String>, JpaSpecificationExecutor<PostEntity> {
    //根据name 来查询
    public List<PostEntity> findByName(String name);

    //根据nameid 来查询
    public PostEntity findByNameId(String id);

    //查询id为 参数 且name中含有 参数 的用户
    public PostEntity findByNameIdAndNameLike(String id,String name);

    //使用Query注解来写sql,更加灵活。默认是hsql, 使用nativeQuery = true,来表明它是原生sql
	@Query(value="select * from post t where t.delect='0'", nativeQuery = true)
	public List<PostEntity> selectAll();
	
    //更新、插入、删除 要添加	@Modifying  @Transactional 注解
	@Modifying 
	@Transactional
	@Query(value="update post t set t.delect='1' where t.id in (:collection)", nativeQuery = true)
	public void deletePost(@Param("collection") Collection<String> collection);

}

	@Override
	public boolean deletePost(JSONObject params) {
		if( params != null){

			try {
				List<String> idslist = (List<String>)params.get("ids");
				postRepository.deletePost(idslist);
				return true;
			} catch (Exception e) {
				return false;
			}
		}
		return true;
	}

2,方法名查询:只需要按照SpringDataJpa提供的方法名称规则去定义方法,在dao接口中定义方法即可。

3, 复杂查询

实体类 


import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;

/**
*
* @SystemName 帖子信息实体类
* @ModuleName
* @ClassName postEntity
* @author liunn
* @Date 2022年5月5日 下午15:33:58
* @version V1.0.0
* @Description
*/
@Entity
@Table(name="post")
@SequenceGenerator(name = "LOG_ID_SEQ",sequenceName = "SEQ_OPERATION_LOG",allocationSize = 1)
public class PostEntity  implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	//帖子信息id
	@Id
	@GeneratedValue(generator = "idGenerator")
	@GenericGenerator(name = "idGenerator", strategy = "uuid")	
	private String id;
	//帖子信息图片的路径
	private String pictureurl;
	//帖子的名字
	private String there;
	//创建帖子的时间
	private String created;
	//帖子的内容
	private String info;
	//创建帖子的用户ID
	private String userid;
	//创建帖子的用户
	private String username;
	//是否删除 0.没有删除,1删除
	private String delect = "0";
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getCreated() {

		return created;
	}
	public void setCreated(String created) {
		this.created = created;
	}
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getDelect() {
		return delect;
	}
	public void setDelect(String delect) {
		this.delect = delect;
	}
	public String getPictureurl() {
		return pictureurl;
	}
	public void setPictureurl(String pictureurl) {
		this.pictureurl = pictureurl;
	}
	public String getThere() {
		return there;
	}
	public void setThere(String there) {
		this.there = there;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	
}

	@Override
	public Map<String, Object> selectByUser(Map<String, Object> params) {
		
		Specification<PostEntity> specification = new Specification<PostEntity>() {

			private static final long serialVersionUID = 1L;

			@Override
			public Predicate toPredicate(Root<PostEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				List<Predicate> preList = new ArrayList<Predicate>();
				
				if (params != null && !params.isEmpty()) {
					
					//获取 map 的 key 和value , key = kv.getKey(); value = kv.getValue()
					for(Map.Entry<String,Object> kv : params.entrySet()){
						
						if(!"pageIndex".equals(kv.getKey()) && !"pageSize".equals(kv.getKey())) {
							Path<String> namePath = root.get(kv.getKey());
							Predicate predicate = cb.equal(namePath,  kv.getValue());
							preList.add(predicate);
						}
					}

				}
				
				//过滤掉 删除的数据 1代表删除,0代表没有删除。
				Path<String> namePath = root.get("delect");
				Predicate predicate = cb.equal(namePath, "0");
				preList.add(predicate);
				query.where(preList.toArray(new Predicate[preList.size()]));
				preList.clear();
				return query.getRestriction();
			}
		};

	    Sort sort =new Sort(Sort.Direction.DESC, "created");
	    
	    int pageIndex = 0, pageSize = 1;
		if (params.get("pageIndex") != null && params.get("pageSize") != null) {
			pageIndex = (int) params.get("pageIndex");
			pageSize = (int) params.get("pageSize");
		}
	    Pageable pageable =PageRequest.of(pageIndex , pageSize, sort);
		Page<PostEntity> Files =postRepository.findAll(specification, pageable);
		List<PostEntity> result = new ArrayList<PostEntity>();
		long count = 0;
		result = Files.getContent();
		count = Files.getTotalElements();
		
		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("result", result);
		resultMap.put("count", count);
		return resultMap;
	}

需要注意:root.get() 括号里面的值要在表字段。否则它会在数据库表创建。

                排序使用new Sort ()    

                分页使用PageRequest.of()

                不同版本的springboot 创建不同,低版本的是 new PageRequest()

                下面这句话意思 就是,查询 字段delect为0。

				Path<String> namePath = root.get("delect");
				Predicate predicate = cb.equal(namePath, "0");

                模糊查询


				Path<String> namePath1 = root.get("info");
				Predicate predicate1 = cb.like(namePath1, "%北京%");
 

通过ID来查询

	@Override
	public PostEntity selectById(Map<String, String> params) {
		
		String id = params.get("id");
		Optional<PostEntity> optional=postRepository.findById(id);
		if(optional.isPresent()) {
			PostEntity postEntity=optional.get();

			return postEntity;
		}else {
		return null;
		}
	}

保存

	@Override
	public boolean savePost(PostEntity postEntity) {
		
		// java8新提供的类:LocalDate、LocalTime、LocalDateTime。不存在线程不安全问题。
	    DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	    //LocalDateTime 转字符串
	    LocalDateTime dateTime = LocalDateTime.now();
	    String dateTimeStr = dateTime.format(pattern);
	    postEntity.setCreated(dateTimeStr);
		boolean r = postRepository.save(postEntity) != null ? true : false;
		return r;
	}

保存或更新,如果ID有值,它会看数据库那个ID有没有数据,没有就新增,有就更新

	@Override
	public boolean updata(PostEntity postEntity) {
		boolean r = postRepository.saveAndFlush(postEntity) != null ? true : false;
		return r;

	}

多表关联查询,需要了解Hibernate的一对多,一对一,多对多,多对一,而且,有关联关系的话,Hibernate会给你的表添加外键,外键有利有弊。而且比较复杂可以参考下面两个链接

参考:https://blog.csdn.net/qq_36639232/article/details/106116274

参考:https://blog.csdn.net/q990609179/article/details/103313933

待 增加

Spring Data JPA 是一个用于简化数据库访问的框架,它基于 JPA (Java Persistence API) 规范,提供了一种更简单、更高效的方式来访问和操作数据库。 下面是使用 Spring Data JPA 的一般步骤: 1. 添加依赖:在你的项目中,添加 Spring Data JPA 的依赖。你可以在 Maven 或 Gradle 配置文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 2. 配置数据库连接:在 `application.properties` 或 `application.yml` 文件中配置数据库连接信息,包括数据库 URL、用户名、密码等。 3. 创建实体类:创建与数据库表对应的实体类,并使用 JPA 注解来映射实体类与数据库表之间的关系。 ```java @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; // getters and setters } ``` 4. 创建 Repository 接口:创建一个继承自 `JpaRepository` 的接口,并通过方法命名规则或自定义查询方法来定义数据库操作。 ```java public interface UserRepository extends JpaRepository<User, Long> { List<User> findByAgeGreaterThan(Integer age); } ``` 5. 使用 Repository:在需要访问数据库的地方,注入 Repository 接口,并调用其中的方法进行数据库操作。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getUsersByAgeGreaterThan(Integer age) { return userRepository.findByAgeGreaterThan(age); } } ``` 这只是 Spring Data JPA 的基本用法,你还可以使用更高级的特性,如分页、排序、复杂查询等。希望这些信息对你有帮助!如果你有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值