当前位置: 首页 > 面试题库 >

在WHERE子句中具有集合的HQL

楚宏胜
2023-03-14
问题内容

我一直在为整个查询尝试正式向我做噩梦的查询。该系统是用户和联系人管理。所以我有UserAccountContactPhone

UserAccountContact手机具有双向一对多关系,并且在电话上具有单向关系,所有关系均由映射Set

//UserAccount mapping 
@OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL})
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Phone> phones = new HashSet<Phone>();

@OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Contact> contacts = new HashSet<Contact>();

现在,“联系人”具有一对多电话通话

@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL})
private Set<Phone> phones = new HashSet<Phone>();

我正在编写一种方法,通过电子邮件唯一字段来检查特定用户的同一联系人是否存在相同号码。

我知道我可以为此而覆盖equalsand
hashcode,但是由于电话是按set映射的实体,因此我现在不知道该怎么做。因此,我想提供一种方法来在联系页面上的每个条目输入之前为我检查该唯一性

public boolean checkForExistingPhone(String userEmail, String formatedNumber) {
    List<Contact> result = null;
    Session sess = getDBSession().getSession();

    String query = "select Contact ,cphones.formatedNumber from Contact c inner join    Contact.phones cphones where c.UserAccount.email = :email and cphones.formatedNumber= :number";
//        try {
        result = (List<Contact>) sess.createQuery(query)
                .setParameter("email", userEmail)
                .setParameter("number", formatedNumber).list();
//        } catch (HibernateException hibernateException) {
//            logger.error("Error while fetching contacts of email " + userEmail + " Details:"     + hibernateException.getMessage());
//        }
        if(result == null)
            return false;
        else
            return true;
}

我继续出现此错误:

org.hibernate.hql.ast.QuerySyntaxException: Contact is not mapped [select
cphones.formatedNumber from Contact c inner join Contact.phones cphones where
c.UserAccount.email = :email and cphones.formatedNumber= :number].

我真的无法弄清楚会发生什么,首先我不知道如何处理HSQ中的集合。感谢阅读


问题答案:

HQL查询可能与以下几行相似:

选择c
来自联系人c
加入c.phones cphones
其中c.userAccount.email =:email
  和cphones.formatedNumber =:number

另外,您可能想要处理这样的查询结果。该 列表() 方法返回总是一个列表,从来没有空。

 return !result.isEmpty();


 类似资料:
  • 问题内容: 我有一个查询说 ,我想要的是使用where子句或其他任何方式显示多个记录,以便获得以下数据。 姓名编号 我试着用 在clause.ie 或等,但没有作品。 问题答案: 只需使用一个子句 您也可以使用OR(仅用于提供信息,在这种情况下,我将不使用此功能) 如果您的where子句中有其他条件,请不要忘记在“或”周围加上圆括号。

  • 问题内容: 如果列匹配,是否有很好的方法在SQL中表示选择特定的行,否则选择更通用的行?就像是: 我只希望它返回一个特定的记录(如果存在),否则,如果找不到特定的列匹配项,则返回通用的“ ALL”记录。看起来COALESCE与我正在寻找的相似,但我不知道在语法上如何工作。 问题答案: @Blorgbeard答案(使用前1个和排序依据)可能是最好的方法,但只是有所不同,您还可以使用子查询,但不存在:

  • 问题内容: 在我的SQL中,我使用and 子句执行搜索。但是,我需要对两列的组合值执行搜索- 和: 这行不通,但是我想知道如何才能按照这些原则做点什么? 我试图按两列来分开搜索,如下所示: 但这显然不起作用,因为搜索查询是这两列的组合值。 问题答案: 使用以下内容: 请注意,为了使此功能按预期工作,应修剪名字和姓氏,即,它们不应包含前导或尾随空格。最好在插入数据库之前在PHP中修剪字符串。但是您也

  • 问题内容: 简而言之,我有一个表格,其中除其他外,还包含一个用于时间戳记的列。我想获得具有最新(即最大价值)时间戳的行。目前,我正在这样做: 但是我宁愿做这样的事情: 但是,SQLite拒绝此查询: 该文件证实了这一行为(页面底部): 聚合函数只能在SELECT语句中使用。 我的问题是:是否可以编写查询以获取具有最大时间戳的行,而无需对select进行排序并将返回的行数限制为1?这似乎应该有可能,

  • 问题内容: 是否可以采用以下方式构成的表: 最终变成这样的表: 我已经研究过使用枢轴,但无法使其正常工作。 我目前每个月都使用CROSS APPLY表值函数。 有一个更好的方法吗? 编辑:添加了现有查询-试图简化显示: 功能看起来像 问题答案: 您不需要多个子查询。答案很容易-使用集合理论。从您的第一个表ID / Month / Info1 / Info2轻松合并即可完成ID / Month +(

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。