当前位置: 首页 > 知识库问答 >
问题:

在没有实体映射设置的情况下,使用Hibernate条件从多个表中检索数据

马凡
2023-03-14

我的项目有问题。我试图创建一个搜索功能,从用户表中搜索用户,但与此同时,我还想从另一个化身表中检索用户化身的相应“url”。我确实想在这两个表之间创建一个硬映射。我怎样才能灵活地使用Hibernate标准呢?两个表都使用“loginID”主键。

我有两个班:

public class User{
    private String loginID;
    private String screenname;
    ......
}
public class Avatar{
    private Integer id;
    private String loginID;
    private String url;
    .......
}

我写的是:

  public List<Users> searchLogin(String keywords, int startFrom) {
        List<Users> userList = new ArrayList<Users>();
        try {
            Session session = HibernateUtil.beginTransaction();
            Criteria criteria = session.createCriteria(Users.class,"users");
            criteria.add(Restrictions.ilike("loginID", keywords, MatchMode.ANYWHERE));
            userList = criteria.list();
            if (session.isOpen()) {
                session.close();
            }
            return userList;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

谢谢大家!!

共有3个答案

巢安澜
2023-03-14

两个表都使用"loginID"的主键。

对吗?我看到Avatar类有一个名为“id”的字段,这不是id/主键吗?

我还注意到,您使用loginId字段从Avatar引用到User。链接实体的正确方法是通过它们的类。使用注释时,应如下所示:

@Entity
public class User
{
    @Id
    private String loginId;
    private String screenName;
    @OneToOne(mappedBy = "user")
    private Avatar avatar;
}

@Entity
public class Avatar
{
    @Id
    private Integer id;
    @OneToOne
    private User user;
    private String url;
}

如果你想获取一个User和属于UserAvatar的URL,你能做的最好的事情就是获取一个User,它是Avatar加入,然后访问Avatar的URL,因此不必从Object转换到UserAvatar以保持类型安全。

User user = fetchUserJoinAvatar("123");
String url = user.getAvatar().getUrl();

public User fetchUserJoinAvatar(String loginId)
{
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<User> query = cb.createQuery(User.class);

    Root<User> user = query.from(User.class);
    user.fetch("avatar");
    query.select(user).where(cb.equal(user.get("loginId"), loginId));
    return em.createQuery(query).getSingleResult();
}
陆沈浪
2023-03-14

使用HQL

from User u,Avatar a where where u.loginID = a.loginID and u.loginID = :loginID

这将返回[用户,化身]阵列的列表。

柴兴修
2023-03-14

晚了,但它可能对其他真正谷歌它并在这里结束的人有用。不需要地图或使用HQL。

以下是方法:

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
    Root<EntityA> entityARoot= criteria.from(EntityA.class);
    Root<EntityB> entityBRoot = criteria.from(EntityB.class);

    //Predicates
    List<Predicate> predicates = new ArrayList<>();
    //Add the predicates you need

    //And predicates
    List<Predicate> andPredicates = new ArrayList<>();
    andPredicates.add(builder.equal(entityARoot.get("id"), entityBRoot.get("id")));
    andPredicates.add(builder.and(predicates.toArray(new Predicate[0])));

    criteria.multiselect(entityARoot, entityBRoot);
    criteria.where(andPredicates.toArray(new Predicate[0]));

    TypedQuery<Tuple> query = em.createQuery(criteria);

    List<Tuple> result = query.getResultList();
 类似资料:
  • 问题内容: 我有两个hibernate类:基类和具有附加字段的扩展类。(这些字段由其他表映射。) 例如,我有: 如何在Hibernate中对此进行映射?hibernate文档说明了三种类型的继承配置:每个类一个表,一个具有类型列的表和一个联接表-在此都不适用。 我之所以需要这样做,是因为类A来自通用框架,该框架已在多个项目中重用,而类B(和Node)是特定于一个项目的扩展- 不再使用。将来,我可能

  • 我正在使用实体框架映射一些表,但除非我声明一些列作为主键,否则我无法这样做。 这里的问题是,数据库中的表没有主键,并且有数百万行。我没有创建新Id列的权限。 Obs:如果我将属性添加到诸如

  • 我正在尝试编写一个相当于以下SQL查询的Hibernate Criteria API: 这是我的实体 这是我的实体 是引用的外键。虽然没有明显的实体级关系,我也不能添加任何关系。

  • 我有以下2个实体: 它们有共享字段/列,例如:等,但是每个主键id字段的名称不同,例如有和 有没有一种方法可以创建一个基本实体超类来保存这些通用的

  • 问题内容: 我在Android应用程序上使用Firebase,我知道如何使用EventListener从数据库中获取数据。到目前为止。 我的问题是:我有一个ReciclerView,它显示数据中的信息,但仅当我修改数据库时才显示。如果我关闭该应用程序然后再次打开,它什么也不会显示。然后,我进行一些修改,并将所有元素显示在容器中。 有什么方法可以加载数据而无需等待事件,而是手动获取? 先感谢您。 更

  • 在Hibernate继承映射中,JPA每类表策略, 根实体不需要表来映射, 子实体做,每个子实体都有一个表。 在我的理解中,实体是:带有映射配置的java类,它应该映射到一个表, 那么,如果没有要映射的表,根实体如何作为实体存在呢? 如果它不需要一个表来映射,我们为什么不用一个@mappedSuperclass呢? 我们可以使用此根实体进行查询吗?