【发布时间】:2020-09-10 06:26:46
【问题描述】:
我有抽象类 Entity 和这两个实体 Role 和 User 从实体扩展:
@Entity@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Entity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected long id = 0; }
@Entity
public class Role extends Entity{
@Column(name = "NAME", unique = true, nullable = false)
private String name;
}
@Entity
public class User extends Entity{
@Column(name = "ABBREVIATION", unique = true, nullable = false)
private String abbreviation;
//The user can have several roles
@ManyToMany
@JoinTable(
name = "USER_ROLE",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
private Set<Role> roles = new HashSet<>();
}
现在,当我单击角色时,我希望显示用户的缩写。 它的本机查询是:
query = em.createNativeQuery("SELECT ABBREVIATION FROM dbtest.user WHERE ID IN"
+ " (SELECT USER_ID FROM dbtest.user_role WHERE ROLE_ID = " + role.getId() + ")");
我现在已经创建了一个条件查询,它总是给我一个空列表。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Role> cq = cb.createQuery(Role.class);
Root<User> root = cq.from(User.class);
Subquery subquery = cq.subquery(Role.class);
Root subfrom = subquery.from(Role.class);
subquery.select(subfrom.get(Role_.id));
subquery.where(cb.equal(subfrom.get(Role_.id), role.getId()));
cq.multiselect(root.get(User_.abbreviation));
cq.where(cb.equal(root.get(User_.id), subquery));
query = em.createQuery(cq);
return query.getResultList();
这里有什么问题吗?有人可以帮忙吗?
【问题讨论】:
-
你检查日志中创建的
actual query了吗? -
@Sujitmohanty30 天哪,我明白了:从用户中选择新实体。 )
-
查看您的子查询。它会生成像
"SELECT ROLE_ID FROM user_role WHERE ROLE_ID = " + role.getId()这样的无用查询。所以它返回role.getId()值。您必须在子查询中选择 USER_ID,但您的实体不包含此类字段。我已经在我的回答中说明了
标签: java sql jpa criteria criteria-api