jpa - JPA - 从列表中查找表中不存在的项目
问题描述
给定一个电子邮件列表,我需要找出表格中不存在哪些电子邮件。使用 SQL,我可以执行以下操作:
SELECT e.email
FROM
(
VALUES('email1'),('email2'),('email3'),('email4')
) AS e(email)
EXCEPT
SELECT username FROM dbo.UsersTbl;
如何编写等效的 JPQL?在应用程序中, values email1
, email2
... 需要根据传入的列表动态构建(而不是硬编码)。使用 Spring Data JPA 本机查询,我可以执行以下操作:
@Query( value =
"SELECT e.email " +
" FROM " +
"( " +
" VALUES('email1'),('email2'),('email3'),('email4') " +
" ) AS e(email) " +
" EXCEPT " +
" SELECT username FROM dbo.UsersTbl ",
nativeQuery=true)
List<String> findMissingEmails(List<String> emails);
但是如何将电子邮件列表传递给查询?
解决方案
对于固定数量的电子邮件参数,这可能有效:
@Query( value =
"SELECT e.email " +
" FROM " +
"( " +
" VALUES(:email1),(:email2),(:email3),(:email4) " +
" ) AS e(email) " +
" EXCEPT " +
" SELECT username FROM dbo.UsersTbl ",
nativeQuery=true)
List<String> findMissingEmails(String email1, String email2, String email3, String email4);
对于大量和/或动态的电子邮件,更好的方法可能是使用在运行时构建的NativeQuery。
旧答案- 或多或少与所要求的完全相反,但我会将其保留在这里作为参考。
使用命名参数:
@Query("SELECT u.email FROM User AS u WHERE u.email NOT IN (:emails)")
List<String> findMissingEmails(@Param("emails")Collection<String> emails);
或者,您可以使用JPA 查询方法:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAllByEmailNotIn(Collection<String> emails);
}
不幸的是,该方法会获取并返回一个User
s 列表而不是他们的电子邮件列表。
要仅获取电子邮件,您可以使用JPA 投影。
假设User
实体有一个String
名为的字段,email
可以使用以下投影:
public interface UserEmail {
String getEmail();
}
这是存储库方法:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<UserEmail> findAllByEmailNotIn(Collection<String> emails);
}
推荐阅读
- kdb - 为什么我的 ctp 没有为我订阅的其中一个表获取任何数据?
- python - 如何给按钮颜色
- javascript - WordPress网站的视差滚动
- date - 为什么将此 Google 表格公式设为 ARRAYFORMULA 会改变其行为?
- django - Django - 试图一起清理独特的表单,CrispyError
- python - Windows Subsystem for Linux 上的 Anaconda 环境作为 PyCharm 中的 python 解释器和 Jupyter Notebook 中的内核
- node.js - 融合托管付款,响应页面不发回信息
- git - 被 git 困住:pack 超过了最大允许大小
- tcp - 配置框架?从功率计捕获和读取 PMU 测量值的问题
- astropy - 如何告诉`photoutils`仅绘制满足条件的孔径?