Spring Data JPA有没有办法通过计算字段来查找实体并且不使用@Query?



例如:我想找到列表书和计数categories>3.如何解决它,不使用接口库中的注释查询?

package com.web.dacn.entity.book;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.web.dacn.entity.user.Author;
import com.web.dacn.entity.user.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Entity
@Table(name = "book")
@AllArgsConstructor
@NoArgsConstructor
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "name", 
nullable = false, 
columnDefinition = "NVARCHAR(100)")
private String name;
@Column(name = "thumbnail", columnDefinition = "TEXT")
private String thumbnail;
@Column(name = "view", 
columnDefinition = "INTEGER DEFAULT 1",
nullable = false)
private Integer view;
@Column(name = "price")
private Double price;
@Column(name = "vip")
private Boolean vip;
@Column(name = "description", 
columnDefinition = "TEXT",
nullable = false)
private String description;
@Column(name = "slug", 
columnDefinition = "VARCHAR(2000)",
nullable = false)
private String slug;
@Column(name = "meta_title",
columnDefinition = "NVARCHAR(100)")
private String metaTitle;

@Column(name = "meta_description", columnDefinition = "TEXT")
private String metaDescription;
@Column(name = "status", 
nullable = false, 
columnDefinition = "INTEGER DEFAULT 1")
private Integer status;
@Column(name = "mod_time", nullable = false)
private Date mod_time;
@ManyToOne(cascade = CascadeType.ALL, targetEntity = User.class)
@JoinColumn(name="mod_user_id")
@JsonIgnore
private User user;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_author", 
joinColumns = @JoinColumn(name = "book_id", nullable = false), 
inverseJoinColumns = @JoinColumn(name = "author_id", nullable = false))
@JsonIgnore
private List<Author> authors = new ArrayList<>();
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_bookcategory", 
joinColumns = @JoinColumn(name = "book_id", nullable = false), 
inverseJoinColumns = @JoinColumn(name = "category_id", nullable = false))
@JsonIgnore
private List<BookCategory> categories = new ArrayList<>();  
}

我不确定除了使用自定义查询还有其他方法可以做到这一点。相反,您可以这样使用streamapi:

List<Book> books = repository.findAll();
List<Book> booksWithCategories = books.stream()
.filter(book -> book.getCategories().size() > 3)
.collect(Collectors.toList());

最新更新