java - 如何通过排除原则从另一个表中过滤选择

标签 java sql hibernate spring-boot spring-data-jpa

我在Spring Boot v1.5.7下的应用

我有 3 个实体(示意性地):

@Entity
public class Word {
    @Id
    @GeneratedValue
    private Integer id
    ...
}

@Entity
public class UserWordList {
    @Id
    @GeneratedValue
    private Integer id

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "word_id")
    private Word word;
}

@Entity
public class UserAnotherWordList {
    @Id
    @GeneratedValue
    private Integer id

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne
    @JoinColumn(name = "word_id")
    private Word word;
}

现在我需要选择用户的所有单词,但排除用户列表中放置的单词

user_id=1 的 native SQL 为

select *
from  Word w
left join UserWordList uwl
    on w.id = uwl.word_id and uwl.user_id = 1
left join UserAnotherWordList uawl
    on w.id = uawl.word_id and uawl.user_id = 1
where uwl.word_id is NULL
and   uawl.word_id is NULL

最好的方法是什么?理想情况下,我想使用 Spring Data 功能或 HQL,但我不明白如何...

UPD

我用 native 查询解决了我的问题:

@Entity
@NamedNativeQuery(
    name = "User.getWordsToProcess",
    resultClass = Word.class,
    query = "<...native query to select Words...>"
)
public class User {...}

...

public interface UserRepository extends CrudRepository<User, Integer> {
    List<Word> getWordsToProcess(Integer userId);
}

最佳答案

最快的答案是 Criteria api(但在 hibernate 5.2 及更高版本中已弃用。) 所以你可以使用 Hql :

getSession().createQuery(" select * from UserWordList u left join fetch u.word
left join fetch u.user").list()

您可以使用union或创建另一个查询来获取UserAnotherWordList。 您还可以在 Hql 中设置任何限制,如下所示:

Query query =  getSession().createQuery(" select * from UserWordList u left join fetch u.word left join fetch u.user us where us.user = :sample").list();
query.setParameter("sample",value);
query.list();

关于java - 如何通过排除原则从另一个表中过滤选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752491/

相关文章:

java - 如何测试使用数据库登录的Servlet?

java - 静态工厂方法中的泛型? ( java )

sql - 在 SQL Server 中附加 .mdf 文件时出现 "non release version(539), not supported by this version"错误。如何解决?

java - 使用 hibernate 的 JPA 2 标准查询无法左连接

java - HSQLDB:原因:使用 MAX,但不使用 Group By,并获取 java.sql.SQLSyntaxErrorException:表达式不在聚合或 GROUP BY 列中:

java - hibernate cfg文件

Java - 当两个键映射到相同的值时返回什么?

sql - 如何在自引用 has_and_belongs_to_many 中查找没有 parent 的条目?

php - CodeIgniter 搜索功能

hibernate - StatelessSession 在 AbstractEntityPersister (Hibernate) 中被转换为 Session