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

Hibernate条件查询收集表?

廖弘伟
2023-03-14
问题内容

我有以下实体

@Entity
@Table(name = "rule")
public class Rule implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "rule_id")
    private Long id;

    @ElementCollection(targetClass = Action.class)


     @CollectionTable(name = "rule_action", joinColumns = @JoinColumn(name = "rule_id"))
        @Enumerated(value = EnumType.STRING)
        @Column(name = "action")
        private Set<Action> actions;

//After editing as per jbrookover's suggestion adding a new mapping
       @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
       @JoinColumn(name = "rule_id")
       private Set<RuleAction> ruleActions;


    }

以下是我的行动

public enum Action {
    PHONE, EMAIL, POSTAL,PHONE_OR_EMAIL, SMS;
}

我想获取具有特定操作集的规则列表,我正在尝试执行此操作

 DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class,"rule");
 criteria = criteria.createAlias("rule.actions", "action");
 criteria.add(Restrictions.in("action.name",actionSet));
 return getHibernateTemplate().findByCriteria(criteria);

但是获取org.hibernate.MappingException:集合不是一个关联:html" target="_blank">异常。

编辑
因此,在jbrookover的指导下,我尝试为Action命名为RuleAction的包装器类,并能够建立一个oneToMany关系,此外,我还如下修改了查询

    Set<Action> act = new HashSet<Action>();
    act.add(Action.EMAIL);
    act.add(Action.POSTAL);

    DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class);
    criteria.add(Restrictions.eq(SUPPORT_LANG, Language.valueOf("EN")))
            .createCriteria("ruleActions").add(Restrictions.in("action",act));
    return getHibernateTemplate().findByCriteria(criteria);

但是,这将返回所有具有EMAIL或POSTAL的规则,但是我想要的是 所有具有EMAIL和POSTAL的规则。 请帮助我修改查询。


问题答案:

抱歉,Hibernate不支持您要执行的操作。请参阅以下常见问题解答:

http://community.jboss.org/wiki/HibernateFAQ-
AdvancedProblems#Im_getting_orghibernateMappingException_collection_was_not_an_association_when_I_try_to_join_a_collection_of_components_with_Criteria_queries

我对此也很不满意。但是,正如您所看到的,他们已经尝试修复它,但一直未能做到,并已将其发布给社区以对其进行处理。您有几种选择:

  1. 使用HQL运行查询。
  2. 用单个Enum字段将集合关联重新编写为实际的实体类。

您可以执行以下操作:

 @Entity
 public class ActionWrapper {

      public Action action;
 }

然后,更新您的关联并进行相应的查询,以使其Rule具有Set<ActionWrapper>。还有其他解决方法,但是您基本上不能同时使用Criteria@ElementCollection

更新资料

为了进一步限制查询,以确保您获得满足两个动作的规则,您需要运行子查询并对匹配值进行“和”运算。这样的事情应该起作用:

 Criteria subCriteria = criteria.createCriteria("ruleActions");
 Disjunction and = Restrictions.conjunction();
 for (Action a : act)
    and.add(Restrictions.eq("action", a)
 subCriteria.add(and);

最后,您可能会发现重复的结果。这很常见,可以通过添加以下内容来消除:

 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

我不能说这段代码的效率-从长远来看,HQL可能更好。但是,我在其他项目中也做过类似的事情,没有遇到任何问题。



 类似资料:
  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。

  • 我试图比较Hibernate条件和命名查询的性能。我知道这一切都取决于实际的查询本身,最后一个字取决于它们在运行时如何配置文件。尽管如此,试图理清每一个都有什么。 我试图将Q分为两个部分&寻找两者的验证/更正: 命名查询与HQL相比具有相同的优势--查询在启动时被解析一次。然后从应用程序中任何必要的地方执行。 第2部分--比较两者: 所以在这张图里, 提亚。

  • 我需要将这个sql查询转换为hibernate条件,请大家帮忙。 按名称顺序按应用描述限制3从设备组中选择名称,计数(*)为应用

  • 问题内容: 我不确定如何描述这个问题,所以我认为举个例子是问我问题的最好方法: 我有两个表具有多对多关系: 驾驶执照<-> LicenceClass LicenceClass是“汽车”,“摩托车”和“中型刚性”之类的东西。 使用Hibernate Criteria,如何找到同时具有“汽车”和“摩托车” LicenceClasses的所有许可证? 2008年12月11日更新我发现可以使用自定义Res

  • 我需要将以下查询转换为hibernate条件查询。请帮忙 由于投票表上的复合主键,我用@Embeddable分隔了主键,所以后面的createQuery不起作用 和可嵌入对象 请建议一个更好的方法。

  • 我有一个班级评语: 保留comment类可以工作,但以下条件查询是有效的: 抛出org.hibernate.exception.DataException:未为参数%1指定值。 这是生成的查询: 选择this_.comment_id作为comment1_0_0_,this_.comment_id作为comment0_0_,commenttop2_.comment_id作为comment1_0_2_