簡體   English   中英

無法在Spring Data JPA自定義存儲庫中編寫我的SQL查詢

[英]Can't write my SQL query in Spring Data JPA custom repository

我希望在自定義JPA存儲庫中實現SQL的一部分

SELECT * FROM users u
    JOIN skills_user sku on sku.user_id = u.id
    JOIN specs_user spu on spu.user_id = u.id
    GROUP BY u.id
    HAVING ANY(sku.dictionary_id in (15,20) or spu.dictionary_id in (15,20))
    ORDER BY u.id

我試過這個:

//Other predicates    
if (filterQuery.getSkills() != null && !filterQuery.getSkills().isEmpty()) {
            String[] tmp = filterQuery.getSkills().replaceAll(" ", "").split(",");
            List<Integer> ids = new ArrayList<>();
            for (String s : tmp) {
                ids.add(Integer.parseInt(s));
            }
            List<Predicate> tmpPredicates = new ArrayList<>();
            Join<User, Dictionary> skillJoin = root.join("skillList");
            Join<User, Dictionary> specsJoin = root.join("specsList");
            for (Integer id : ids) {
                tmpPredicates.add(builder.or(builder.equal(skillJoin.get("id"), id), builder.equal(specsJoin.get("id"), id)));
            }
            predicates.add(builder.and(tmpPredicates.toArray(new Predicate[tmpPredicates.size()])));
        }
//Other predicates

但它無法正常工作。

如何在JPA自定義存儲庫中正確實現這一點?

有用戶和詞典類的代碼:

    @Entity
@SequenceGenerator(name = "user_gen", sequenceName = "users_seq")
@Table(name = "users")
public class User {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_gen")
    private Long id;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @Column(name = "name")
    private String name;

    @Column(name = "surname")
    private String surname;

    @Column(name = "middlename")
    private String middlename;

    @Column(name = "academic_group")
    private String academicGroup;

    @Column(name = "entrance_year")
    private int entranceYear;

    @Column(name = "avatar_URL")
    private String avatarURL;

    @Column(name = "salt")
    private String salt;

    @Enumerated(EnumType.ORDINAL)
    @Column(name = "user_group")
    private UserGroup group;

    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "SocialRole_User", joinColumns = {
            @JoinColumn(name = "user_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "socialRole_id",
                    nullable = false, updatable = false) })
    private List<SocialRole> socialRoleList;

    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "specs_user", joinColumns = {
            @JoinColumn(name = "user_id", nullable = false, updatable = true)},
            inverseJoinColumns = {@JoinColumn(name = "dictionary_id",
                    nullable = false, updatable = true)})
    private List<Dictionary> specsList;
    @JsonIgnore
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "skills_user", joinColumns = {
            @JoinColumn(name = "user_id", nullable = false, updatable = true)},
            inverseJoinColumns = {@JoinColumn(name = "dictionary_id",
                    nullable = false, updatable = true)})
    private List<Dictionary> skillList;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Contacts> contactsList;

//Getters and setters
}

字典:

 @Entity
    @SequenceGenerator(name = "dictionary_gen", sequenceName = "dictionary_seq")
    @Table(name = "dictionary")
    public class Dictionary {

        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dictionary_gen")
        private Long id;

        @Column(name = "dic_name")
        private String name;

        @Enumerated(EnumType.STRING)
        @Column(name = "dic_type")
        private DictionaryType type;

    // Getters and Setters
    }

您是否嘗試使用JPQL編寫查詢?

SELECT a FROM User a
INNER JOIN a.specsList b
INNER JOIN a.skillList c
GROUP BY a.id
HAVING ANY(b.id in (15,20) OR c.id in (15,20))
ORDER BY a.id;

這個JPQL應該和普通的SQL一樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM