Does anyone know why Hibernate throws this error?
org.hibernate.query.SemanticException: Could not interpret path expression 'com.example.entity.security.AccountStatus.Description.ACTIVE'
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer$BaseLocalSequencePart.resolvePathPart(BasicDotIdentifierConsumer.java:256) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.BasicDotIdentifierConsumer.consumeIdentifier(BasicDotIdentifierConsumer.java:91) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimplePath(SemanticQueryBuilder.java:4808) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitIndexedPathAccessFragment(SemanticQueryBuilder.java:4755) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathFragment(SemanticQueryBuilder.java:4724) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGeneralPathExpression(SemanticQueryBuilder.java:1423) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
at org.hibernate.grammars.hql.HqlParser$GeneralPathExpressionContext.accept(HqlParser.java:6963) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
The repository with the reportedly incorrect query looks like this:
@Repository
public interface UserAccountRepository extends JpaRepository<UserAccount, Long> {
@EntityGraph(type = EntityGraph.EntityGraphType.FETCH, attributePaths = {
"accountStatus"
})
@Query("""
SELECT user
FROM UserAccount user
WHERE user.userId = ?1
AND user.accountStatus.description = com.example.entity.security.AccountStatus.Description.ACTIVE
""")
Optional<UserAccount> findActiveByUserId(Long userId);
}
And the enum Description
, which is inside the entity AccountStatus
, looks like that:
@Entity
public class AccountStatus {
//...
@JsonIgnoreType
public enum Description {
ACTIVE, INACTIVE, DISABLED, BANNED;
private static Map<String, Description> descriptionByName;
public static Description getByName(String name) {
if (descriptionByName == null) {
descriptionByName = Arrays.stream(values())
.collect(Collectors.toMap(Description::name, d -> d));
}
return descriptionByName.get(name);
}
}
}
Strangely enough, a direct comparison against a string works. So this query doesn't cause any problems:
@Query("""
SELECT user
FROM UserAccount user
WHERE user.userId = ?1
AND user.accountStatus.description = 'ACTIVE'
""")
Only the comparison against the corresponding enum value throws the error. Does anyone know what this could be?
Many thanks for any help