Java Hibernate:使用Ctriteria API从两个链接表获取数据
如何使用Ctriteria API通过值“ispassed”(布尔值)从两个链接表(一对多:一个用户和多个结果)中获取数据Java Hibernate:使用Ctriteria API从两个链接表获取数据,java,hibernate,criteria-api,Java,Hibernate,Criteria Api,如何使用Ctriteria API通过值“ispassed”(布尔值)从两个链接表(一对多:一个用户和多个结果)中获取数据 private List<?> winners; try { SessionFactory factory = HibernateUtil.getSessionFactory(); Session hSession = factory.openSession();
private List<?> winners;
try {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session hSession = factory.openSession();
Transaction tx = null;
try {
tx = hSession.beginTransaction();
winners = hSession.createSQLQuery("select * from usertable u, resulttable r where u.id = r.id where r.ispassed = true").list();
tx.commit();
} catch (Exception e) {
if (tx != null)
tx.rollback();
} finally {
hSession.close();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(winners.size()); // an exception
私人名单获奖者;
试试{
SessionFactory=HibernateUtil.getSessionFactory();
会话hSession=factory.openSession();
事务tx=null;
试一试{
tx=hsSession.beginTransaction();
winners=hsSession.createSQLQuery(“从用户表u中选择*,结果表r,其中u.id=r.id,其中r.ispassed=true”).list();
tx.commit();
}捕获(例外e){
如果(tx!=null)
tx.回滚();
}最后{
hSession.close();
}
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(winners.size());//例外
您可以使用HQL:
from usertable u, resulttable r where u.id = r.id
where r.ispassed = 1
这将返回[User,result]数组的列表
将代码更改为:
private List<?> winners;
try {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session hSession = factory.openSession();
Transaction tx = null;
try {
tx = hSession.beginTransaction();
winners = hSession.createSQLQuery("from usertable u, resulttable r where u.id = r.id and r.ispassed = true").list();
tx.commit();
} catch (Exception e) {
if (tx != null)
tx.rollback();
} finally {
hSession.close();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(winners.size());
私人名单获奖者;
试试{
SessionFactory=HibernateUtil.getSessionFactory();
会话hSession=factory.openSession();
事务tx=null;
试一试{
tx=hsSession.beginTransaction();
winners=hsSession.createSQLQuery(“来自usertable u,Resultable r,其中u.id=r.id,r.ispassed=true”).list();
tx.commit();
}捕获(例外e){
如果(tx!=null)
tx.回滚();
}最后{
hSession.close();
}
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(winners.size());
编辑:
CriteriaBuilder b = em.getCriteriaBuilder();
CriteriaQuery<Tuple> c = b.createTupleQuery();
Root<EntityX> entityXRoot= c.from(EntityX.class);
Root<EntityY> entityYRoot = c.from(EntityY.class);
List<Predicate> predicates = new ArrayList<>();
//Here you need to add the predicates you need
List<Predicate> andPredicates = new ArrayList<>();
andPredicates.add(b.equal(entityXRoot.get("id"), entityYRoot.get("id")));
andPredicates.add(b.and(predicates.toArray(new Predicate[0])));
c.multiselect(entityXRoot, entityYRoot);
c.where(andPredicates.toArray(new Predicate[0]));
TypedQuery<Tuple> q = em.createQuery(criteria);
List<Tuple> result = q.getResultList();
CriteriaBuilder b=em.getCriteriaBuilder();
CriteriaQuery c=b.createTupleQuery();
Root entityXRoot=c.from(EntityX.class);
根EntityRoot=c.from(EntityY.class);
列表谓词=新的ArrayList();
//这里需要添加所需的谓词
List和predicates=newarraylist();
add(b.equal(entityXRoot.get(“id”)、entityYRoot.get(“id”));
andPredicates.add(b.and(predicates.toArray)(新谓词[0]));
c、 multiselect(entityXRoot、entityYRoot);
c、 其中(andPredicates.toArray(新谓词[0]);
TypedQuery q=em.createQuery(条件);
List result=q.getResultList();
您可以创建如下所示的实体类
@Entity
@Table(name="RESULTS")
public class Results implements Serializable {
@Id
@GeneratedValue()
@Column(name="ID")
private Long id;
@ManyToOne
@JoinColumn(name="USER_ID")
private User userId;
@Column(name = "IS_PASSED")
private Boolean ispassed;
other property
... getter() setter()
}
@Entity
@Table(name="USER")
public class User implements Serializable {
@Id
@GeneratedValue()
@Column(name="ID")
private Long id;
@OneToMany(mappedBy = "userId",cascade=CascadeType.ALL)
private Set<Results> resultsSet;
other property
... getter() setter()
}
@实体
@表(name=“结果”)
公共类结果实现可序列化{
@身份证
@生成值()
@列(name=“ID”)
私人长id;
@许多酮
@JoinColumn(name=“USER\u ID”)
私有用户用户ID;
@列(name=“已通过”)
私有布尔值通过;
其他财产
…getter()setter()
}
@实体
@表(name=“USER”)
公共类用户实现可序列化{
@身份证
@生成值()
@列(name=“ID”)
私人长id;
@OneToMany(mappedBy=“userId”,cascade=CascadeType.ALL)
私有集结果集;
其他财产
…getter()setter()
}
如果在属性下面设置,则在hibernate.cfg.xml文件中
<property name="hibernate.query.substitutions">true 1, false 0</property>
true 1,false 0
执行以下HQL查询
String sql = "from User as user "
+ "inner join user.resultsSet"
+ "where resultsSet.ispassed= true";
Query query = getCurrentSession().createQuery(sql);
List<User> UserList = query.list();
String sql=“以用户身份从用户”
+“内部联接用户.结果集”
+“其中ResultSet.ispassed=true”;
Query Query=getCurrentSession().createQuery(sql);
List UserList=query.List();
上面是如何获取用户列表的,现在需要迭代用户列表并使用getter方法获取所有结果 有没有办法通过Ctriteria API获得同样的结果?@Andy:-更新我的答案。请稍等@安迪:请现在检查!谢谢,但我可能会继续使用hql,因为标准示例似乎要复杂得多。list在
list list=hSession.createSQLQuery(“select*from usertable u,resulttable r where u.id=r.id where r.ispassed=1”)之后为null。list()代码>编写winners.size()时可能会引发异常,因为列表winners可能为空。这是真的,但原因是什么?因为您的Session.createSQLQuery(“从usertable u中选择*,resulttable r,其中u.id=r.id,其中r.ispassed=true”).List();是否返回空列表这很清楚,我的意思是查询有问题吗?是的,您使用的是r.ispassed=true instate of r.ispassed=1,而使用session.createSQLQuery时,它基本上会创建本机sql查询。