gpt4 book ai didi

java - 谁能告诉我为什么这个 Hibernate 查询无效吗?

转载 作者:行者123 更新时间:2023-12-02 08:28:08 24 4
gpt4 key购买 nike

我有一个条件查询,执行时会引发以下异常:

java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal syntax near collection: id [select generatedAlias0.permissions from temp.package.commons.user.Role as generatedAlias0 where generatedAlias0.id=2L]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1222)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:320)
at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:227)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:437)
at temp.package.dao.impl.DefaultDAOService.getProperties(DefaultDAOService.java:585)

从代码框中可以看出,引发错误的查询是:

select generatedAlias0.permissions from temp.package.commons.user.Role as generatedAlias0 where generatedAlias0.id=2L

id 属性是实体的属性,用 @Id @GenerateValue 注释。基本上我正在尝试为 id 为 2 的角色对象加载属性“permissions”,这是一个当时未初始化的集合。id 属性是 long 类型。

关于此查询为何失败的任何想法?

我可以在这里发布创建条件查询的代码,但它相当复杂(因为它是基于 LDAP 过滤器等生成的),所以我希望从生成的查询字符串和异常(exception)。如果情况并非如此,请告诉我。

后续:生成此错误的条件查询是这样构建的:

EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

// queryScopeClass is assigned to type temp.pack.commons.user.Role
Class<? extends T> queryScopeClass = role.getClass();

Root<? extends T> from = criteriaQuery.from(queryScopeClass);

Predicate predicate = criteriaBuilder.equal(from.get("id"), new Long(2));
criteriaQuery.where(predicate);

// attempting to get just the role's permissions
CriteriaQuery<Object> select = criteriaQuery.select(from.get("permissions"));
TypedQuery<Object> typedQuery = entityManager.createQuery(select);

return typedQuery.getResultList();

角色和权限类已使用 JPA 和一些 Hibernate 注释进行映射,如下所示:

public abstract class Role implements Serializable {

/**
* The id of this role. Internal use only.
*
* @since 1.0
*/
@Id @GeneratedValue
protected long id;

/**
* Set of permissions granted to this role.
*
* @since 1.0
*/
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy="sourceRole")
protected Set<Permission> permissions = new HashSet<Permission>();

...

}

public class Permission implements Serializable {
private static final long serialVersionUID = 1L;

/**
* The id of this permission. Used internally for persistence.
*
* @since 1.0
*/
@Id @GeneratedValue
@Column(name = "PERMISSION_ID")
protected long id;

/**
* The group to which the owner of this permission is being granted permission to.
*
* @since 1.0
*/
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "TARGET_ROLE_ID")
@ForeignKey(name = "FK_TARGET_GROUP_PERMISSION_ID",
inverseName = "FK_PERMISSION_ID_TARGET_GROUP")
protected Group targetGroup;

/**
* The role that has been granted this permission.
*
* @since 1.0
*/
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "SOURCE_ROLE_ID")
@ForeignKey(name = "FK_SOURCE_GROUP", inverseName = "FK_GROUP_PERMISSIONS")
private Role sourceRole;

...

}

我期望对 typedQuery.getResultList() 的调用返回仅包含一个元素的集合列表:id = 2 的角色的权限对象集合。这是仅选择“权限”集合的尝试来自 id = 2 的对象角色。

我对条件查询不熟悉,很难找出其中的问题。

最佳答案

如果没有更多信息,听起来您正在尝试执行以下操作:

select rp
from Role r
inner join r.permissions rp
where r.id = 2

您可以发布带注释的实体和标准示例吗?

关于java - 谁能告诉我为什么这个 Hibernate 查询无效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com