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