Select JPQL从多个表中选择
我是JPQL新手,在我认为可能是一个非常简单的查询方面遇到了一些问题。请有人解释一下是否可能 我有两个不相关的表格:“客户”和“商家”。它们都包含一个名为“username”的字段。是否有一个查询会返回一个出现在任一表中且与我提供的值匹配的“username”记录Select JPQL从多个表中选择,select,jpa,jpql,Select,Jpa,Jpql,我是JPQL新手,在我认为可能是一个非常简单的查询方面遇到了一些问题。请有人解释一下是否可能 我有两个不相关的表格:“客户”和“商家”。它们都包含一个名为“username”的字段。是否有一个查询会返回一个出现在任一表中且与我提供的值匹配的“username”记录 Query query = entityManager.createQuery("select c from Customers c where c.username = :username"); q
Query query = entityManager.createQuery("select c from Customers c where c.username = :username");
query.setParameter("username", username_);
类似这样的东西,但两张桌子都有 如果这真的不起作用:我认为它起作用了,至少对于CriteriaQuery,我确信它起作用了 Query Query=entityManager.createquery从客户c中选择c,其中c.username=:username m.username=c.username; query.setParameterusername,username 您始终可以这样做: Query Query=entityManager.createQueryselect c from Customers c其中c.username=:username 和c.username 在中选择m.username from Merchants m;
query.setParameterusername,username 听起来您想要将给定用户名与客户或商户匹配。由于这两个表是不相关的,要通过单个查询实现这一点,我相信您需要将一个表中的每一行与另一个表中的每一行连接起来。正如你所想象的,这可能是非常低效的。您最好执行两个简单的查询:
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
}
}
注意:我假设用户名在Customer和Merchant中是唯一的
请注意,如果找不到第一个查询的用户,这种方法将只执行第二个查询。如果您不需要返回对象,即只需要检查对象是否存在,则可以使用两个计数查询简化上述操作。Count查询总是返回一个结果,因此您无需捕获NoResultExceptions可能重复的感谢回答和对我延迟响应的道歉。我可以从你的解决方案中看出,我没有很好地解释我的问题,所以我要再试一次。我想检查我的输入是否与客户或商户匹配,即如果客户表中有一条记录具有正确的用户名,则返回该记录。如果没有,则检查merchant表,如果没有匹配,则不返回任何内容。我希望这更清楚。我只想补充一点,如果是我,遇到这样的情况会发出危险信号,也许我应该重新考虑设计。例如,为什么Customer和Merchant不同时扩展一个公共用户类?如果他们这样做了,您可以简单地查询用户。谢谢您的回答。实际上,我有一个非常类似的解决方案,我只是想知道在JPQL中是否有一种更简洁的方法。关于扩展一个公共类,我对如何减少所需的JPQL代码量感到困惑。你是说我可以将所有的用户表映射到一个用户类,然后运行这样的操作:select u from user where u.username=:username?@Caiman是的,假设Customer和Merchant是用户,你可以将诸如username之类的公共内容移动到用户超类。您仍将拥有包含其任何特定属性的Customer和Merchant。我没有完整的图片,所以它可能不是一个好的改变…这只是一个想法。有关更多信息,请查看。