本文介绍了IN子句中包含JPA标准中的复合主键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我在MySQL中有一个名为 group_table 的表,只有两列 user_group_id 和 group_id (它们都是 VARCHAR 类型)。这两个列一起构成一个复合主键。 我需要使用子选择 IN() @Override @SuppressWarnings($ c $> $ c>}根据传递给查询的值列表选择行。 unchecked) public List< GroupTable> getList(List< GroupTable> list) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery< GroupTable> CriteriaQuery中= criteriaBuilder.createQuery(GroupTable.class); Root< GroupTable> root = criteriaQuery.from(entityManager.getMetamodel()。entity(GroupTable.class)); criteriaQuery.where(root.in(list)); 返回entityManager.createQuery(criteriaQuery).getResultList(); } 执行产生以下查询。 SELECT group_id, user_group_id FROM projectdb.group_table WHERE((?,?)IN ((?,?),(?,?))) / *绑定参数* / bind => [null,null,ROLE_AAA,aaa,ROLE_BBB,aaa] 请注意,前两个参数关于组合键本身是 null 。它们应该分别是 user_group_id 和 group_id 。 是不是在参数列表中被替换? 虽然我不想在表格中形成复合主键,这对于我用于身份验证的JAAS来说可能是必需的。 解决方案 Try this CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<GroupTable> cq = cb.createQuery(GroupTable.class); Root<GroupTable> r = cq.from(GroupTable.class); Expression<EntityPK> exp = r.get("id"); //EntityPK is your primary composite key class and id is the property name of primary key in GroupTable entity Predicate predicate = exp.in(list); cq.select(r).where(predicate); entityManager.createQuery(cq).getResultList();I have a following table with below structurecreate table EntityA ( col1 integer not null, col2 integer not null, description varchar(255), primary key (col1, col2) )Following are the entity and composite key classes@Entitypublic class EntityA implements Serializable { @EmbeddedId private EntityPK id; private String description;// getters, setteres ........................... ............................ }@Embeddablepublic class EntityPK implements Serializable { private int col1; private int col2;// getters, setters, hashcode, equals etcMy test code is CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<EntityA> cq = cb.createQuery(EntityA.class); Root<EntityA> r = cq.from(EntityA.class); Expression<EntityPK> exp = r.get("id"); Predicate predicate = exp.in(list); cq.select(r).where(predicate); em.createQuery(cq).getResultList();The resulting SQL is select entitya0_.col1 as col1_0_, entitya0_.col2 as col2_0_, entitya0_.description as descript3_0_ from EntityA entitya0_ where entitya0_.col1=? and entitya0_.col2=? or entitya0_.col1=? and entitya0_.col2=? or entitya0_.col1=? and entitya0_.col2=? 这篇关于IN子句中包含JPA标准中的复合主键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云! 09-05 03:35