| Hi, I found that this sql will throw error: Invalid path: 'io.github.zhengyhn.practice.hibernate.ABStatus.A'.
select s from Sample s where s.upperStatus = io.github.zhengyhn.practice.hibernate.ABStatus.A
But the below sql works.
select s from Sample s where s.lowerStatus = io.github.zhengyhn.practice.hibernate.BaStatus.A
I read the code and found this is because of these lines of code in org.hibernate.internal.util.ReflectHelper.
if ( conventionalJavaConstants &&
!JAVA_CONSTANT_PATTERN.matcher( name ).find() ) {
return null;
}
And the JAVA_CONSTANT_PATTERN is as below.
private static final Pattern JAVA_CONSTANT_PATTERN = Pattern.compile(
"[a-z\\d]+\\.([A-Z]{1}[a-z\\d]+)+\\$?([A-Z]{1}[a-z\\d]+)*\\.[A-Z_\\$]+", Pattern.UNICODE_CHARACTER_CLASS);
This pattern indicate that the constant name must begin with an upper case alphabet. So "ABStatus" cannot be recognized as valid constant name. However, in my real-world project, we use GSStatus as the enum class name. I have to change it to GsStatus currently. I suggest changing this pattern to "[a-z\\d]\\.([A-Z][a-z\\d]) $?([A-Z] {1} [a-z\\d])* .[A-Z_\\$]". I have written a simple project for finding this issue. You can refer it as reference. https://github.com/zhengyhn/java-practice/tree/master/hibernate-enum |