我的项目有问题。我试图创建一个搜索功能,从用户表中搜索用户,但与此同时,我还想从另一个化身表中检索用户化身的相应“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;
}
}
谢谢大家!!
两个表都使用"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
和属于User
的Avatar
的URL,你能做的最好的事情就是获取一个User
,它是Avatar
加入,然后访问Avatar
的URL,因此不必从Object
转换到User
和Avatar
以保持类型安全。
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();
}
使用HQL
from User u,Avatar a where where u.loginID = a.loginID and u.loginID = :loginID
这将返回[用户,化身]阵列的列表。
晚了,但它可能对其他真正谷歌它并在这里结束的人有用。不需要地图或使用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呢? 我们可以使用此根实体进行查询吗?