java - 多对多的 JPA Criteria API 规范

标签 java spring spring-boot spring-data-jpa jpa-2.0

我有下面提到的三个类(class)。我正在尝试创建一个规范来过滤链接表中匹配的数据。

public class Album {
    private Long id;
    private List<AlbumTag> albumTags;
}

public class Tag {
    private Long id;
    private String category;
}

public class AlbumTag{
    private Long id;
    private Album album;
    private Tag tag;
}

在上面给出的模式中,我试图找到的是 Album 表中所有专辑的列表以及 AlbumTag 中的链接。我想要实现的 SQL,不必相同,如下所示

select *
from Album A 
where (A.Id in (select [AT].AlbumId 
from AlbumTag [AT]))

到目前为止,我尝试过的无效的当然在下面

public class AlbumWithTagSpecification implements Specification<Album> {

    @Override
    public Predicate toPredicate(Root<Album> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {

         final Subquery<Long> personQuery = cq.subquery(Long.class); 
         final Root<Album> album = personQuery.from(Album.class); 
         final Join<Album, AlbumTag> albumTags = album.join("albumTags");
         personQuery.select((albumTags.get("album")).get("id"));
         personQuery.where(cb.equal(album.get("id"), (albumTags.get("album")).get("id"))); 
         return cb.in(root.get("id")).value(personQuery);

    }
}

最佳答案

使用spring boot和spring data JPA,你可以更喜欢实体关系来获取数据。

1.用下面给出的实体关系注释域类:

@Entity
@Table(name="Album")
public class Album {
    @Id
    @Column(name="id")
    private Long id;
    @OneToMany(targetEntity = AlbumTag.class, mappedBy = "album")
    private List<AlbumTag> albumTags;

    //getter and setter
}

@Entity
@Table(name="Tag")
public class Tag {
    @Id
    @Column(name="id")
    private Long id;
    @Column(name="category")
    private String category;

    //getter and setter
}

@Entity
@Table(name="AlbumTag")
public class AlbumTag{
    @Id
    @Column(name="id")
    private Long id;
    @ManyToOne(optional = false, targetEntity = Album.class)
    @JoinColumn(name = "id", referencedColumnName="id", insertable = false, updatable = false)
    private Album album;
    @ManyToOne(optional = false, targetEntity = Tag.class)
    @JoinColumn(name = "id", referencedColumnName="id", insertable = false, updatable = false)
    private Tag tag;

    //getter and setter
}

2. 使用 spring 数据通过以下方式获取详细信息:

Album album = ablumRepository.findOne(1); // get the complete details about individual album.
List<AlbumTag> albumTags = ablum.getAlbumTags(); // get the all related albumTags details for particular album.

希望本文能帮助您解决问题。

关于java - 多对多的 JPA Criteria API 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49515473/

相关文章:

java - 按字母顺序排列 ArrayList

java - java 中的方面未正确编织

java - Statement.executeUpdate() 返回 -1 是什么意思?

java - 使用 MapStruct 将新子实体添加到托管实体

java - FCM 没有看到从 Spring 后端应用程序发送的消息

java - Springboot API 返回空响应

java - 如何从标准输入读取直到 EOF

java - boncp - 在池中的所有连接上执行语句

xml - : 'identifiedType' 的重复定义

spring - 性能调优 Spring RestTemplate