简体   繁体   English

无法在Spring Data JPA自定义存储库中编写我的SQL查询

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

There is part of SQL i want to realize in my Custom JPA 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

I tried this: 我试过这个:

//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

But it isn't work correctly. 但它无法正常工作。

How can i realise this correctly in JPA custom repository? 如何在JPA自定义存储库中正确实现这一点?

there is code of User and Dictionary classes: 有用户和词典类的代码:

    @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
}

Dictionary: 字典:

 @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
    }

Have you tried writing the query using JPQL? 您是否尝试使用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;

This JPQL should work the same as your plain SQL. 这个JPQL应该和普通的SQL一样工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM