【发布时间】:2014-07-29 08:26:49
【问题描述】:
我在 MySQL 中有一个名为 group_table 的表,只有两列 user_group_id 和 group_id(它们都是 VARCHAR 类型)。这两列共同构成一个复合主键。
我需要使用子选择 IN() 执行语句,以根据传递给查询的值列表选择行。
@Override
@SuppressWarnings("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));
return entityManager.createQuery(criteriaQuery).getResultList();
}
实现产生以下查询。
SELECT group_id,
user_group_id
FROM projectdb.group_table
WHERE ((?, ?) IN ((?, ?), (?, ?)))
/*Binding parameters.*/
bind => [null, null, ROLE_AAA, aaa, ROLE_BBB, aaa]
请注意,关于组合键本身的前两个参数是null。它们应该分别是user_group_id 和group_id。
为什么它们没有在参数列表中被替换?
虽然我对在表中形成复合主键不感兴趣,但这(可能)对于我用于身份验证的 JAAS 来说是强制性的。
在这种情况下,查询返回的列表与数据库提供的列表相同,这在现实中是不必要的。我实际上需要这个查询来删除多行。
【问题讨论】:
标签: hibernate jpa eclipselink composite-primary-key jpa-2.1