我是JPQL的新手,对我认为可能是一个非常简单的查询有些麻烦。如果有可能,请有人解释。
我有两个无关表:'客户'和'商家'。它们都包含一个名为“用户名”的字段。是否有一个查询会返回一个“用户名”记录,该记录显示在任一表中并且与我提供的值匹配?
Query query = entityManager.createQuery("select c from Customers c where c.username = :username");
query.setParameter("username", username_);
这样的东西,但对于两个表。
答案 0 :(得分:0)
如果这确实不起作用:(我认为确实如此,至少在CriteriaQuery中我确信它确实如此)
查询查询= entityManager.createQuery(“从客户c中选择c,商家m,其中c.username =:username
和m.username = c.username“);
query.setParameter(“username”,username _);
您可以随时执行此操作:
查询查询= entityManager.createQuery(“从客户c中选择c,其中c.username =:username
和c.username
in(从商家m中选择m.username)“);
query.setParameter(“username”,username _);
答案 1 :(得分:0)
听起来您希望将给定的用户名与Customer
或Merchant
匹配。由于这两个表是无关的,所以使用单个查询来执行此操作,我相信您需要形成一个cartesian product(将一个表的每一行与另一个表中的每一行连接起来)。正如您可能想象的那样,这可能效率很低。你最好做两个简单的查询:
try {
Customer c = em.createQuery("SELECT c FROM Customer c WHERE c.username = :username", Customer.class)
.setParameter("username", username)
.getSingleResult();
// ... do something with the customer ...
} catch (NoResultException e) {
// user wasn't found in the customer table, try merchant:
try {
Merchant m = em.createQuery("SELECT m FROM Merchant m WHERE m.username = :username", Merchant.class)
.setParameter("username", username)
.getSingleResult();
// ... do something with the merchant ...
} catch (NoResultException e) {
// user wasn't found in either table
}
}
注意:我假设username
和Customer
中Merchant
是唯一的。
请注意,如果我们找不到具有第一个查询的用户,则此方法将仅执行第二个查询。如果您不需要返回对象(即只需要检查它是否存在),那么您可以使用两个计数查询来简化上述操作。计数查询总是返回结果,因此您不需要捕获NoResultException
s