【问题标题】:Hibernate Criteria - Fetching results from two tables without any associationHibernate Criteria - 从没有任何关联的两个表中获取结果
【发布时间】:2013-05-05 10:40:35
【问题描述】:

我一直在努力实现使用 Hibernate 标准的搜索功能。要求有点模糊。用户可以在搜索字段中输入任何文本/单词,必须通过多个相互之间没有任何关联的表进行搜索。

以下是两个实体类。

Table A (EntityClassA.java)
Table B (EntityClassB.java)

如果用户输入应该在这两个表中搜索的“anycharecter”,并且应该返回与输入的字符匹配的提取列表。 我还想将表 A 中的结果存储到列表中,并将表 B 中的结果存储到列表中

我不确定如何使用休眠标准来实现。

我只能为一张桌子写这个。

public List<EntityClassAVo> search((string keywords){

List<EntityClassAVo> outputList = new ArrayList<EntityClassVo>();

Criteria criteria = etSessionFactory().getCurrentSession().createCriteria(EntityClassA.class);
//applying restriction - as I need to search entered string in all columns. 
criteria.add(Restrictions.ilike("id", keywords, MatchMode.ANYWHERE));
criteria.add(Restrictions.ilike("name", keywords, MatchMode.ANYWHERE));
criteria.add(Restrictions.ilike("age", keywords, MatchMode.ANYWHERE));
outputList = criteria.list();
return outputList;
}

问题

1) 如果可能,如何在相同的“搜索”方法中为 EntityClassB.java 编写条件?

2) 如果问题 1 可行,如何将 EntityClassA 获取的结果存储在一个对象中,将 EntityClassB 获取的结果存储在另一个对象中?

3)如果上述情况不简单,我可能会要求更改设计(仅当,如果我有充分的理由)。 - 我正在考虑在(表 A)和(表 B)之间放置一个中间表(表 X)。

[已编辑] 4)有一种情况,用户想要从一个表中的一个或两个中搜索结果。我们将如何检查这种情况?

请帮我破解这个东西。

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    为什么不能简单地为 EntityClassB 编写相同的条件?

    Criteria criteriaA = etSessionFactory().getCurrentSession().
                createCriteria(EntityClassA.class);
    criteriaA.add(Restrictions.ilike("id", keywords, MatchMode.ANYWHERE));
    criteriaA.add(Restrictions.ilike("name", keywords, MatchMode.ANYWHERE));
    criteriaA.add(Restrictions.ilike("age", keywords, MatchMode.ANYWHERE));
    
    Criteria criteriaB = etSessionFactory().getCurrentSession().
                createCriteria(EntityClassB.class);
    criteriaB.add(Restrictions.ilike("smth", keywords, MatchMode.ANYWHERE));
    criteriaB.add(Restrictions.ilike("rows", keywords, MatchMode.ANYWHERE));
    criteriaB.add(Restrictions.ilike("here", keywords, MatchMode.ANYWHERE));
    

    然后使用,例如 Map: Entity -> List 来返回结果

    map.put(EntityClassA.class, criteriaA.list());
    map.put(EntityClassB.class, criteriaB.list());
    return map;
    

    【讨论】:

    • 感谢代码,但我无法获得地图部分。你能解释一下吗,这里 Map 的签名是什么?
    • Map 的签名可以是 Map&lt;Class&lt;? extends Entity&gt;, List&lt;? extends Entity&gt;&gt;,如果你有一个基本类 EntityClassA 和 EntityClassB 或者只是 Map&lt;Class&lt;?&gt;, List&lt;?&gt;&gt;。获取数据:EntityClassA a = (EntityClassA) search("ololoolo").get(EntityClassA.class).get(0);
    • 好的,所以?运算符的意思是“任何类”。 extends 关键字可用于将其限定为“任何扩展/实现实体类的类?
    • 我已经编辑了我的问题(添加了问题 4),不确定这个签名在那种情况下是否有效?虽然我会分配一个标志或其他东西,但如果用户想从表 A 中取出结果,我会设置 flag=true 和 Criteria criteriaA,如果他同时选择这两个选项,我也会为表 B 设置。为了实现这一点,我想将设置为 false 的标志的键设置为 0。不确定您是否能正确理解我在此评论中所写的内容:),提前道歉
    • hmmm.. search 看起来像 DAO 方法,所以我更愿意创建两个不同的方法,例如 searchAsearchB 而不是这个,这将返回简单的列表。然后根据用户请求在服务方法中组合结果
    猜你喜欢
    • 2017-10-17
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2012-08-15
    • 2019-03-29
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多