使用 Enum 和 JPA Repository 的查询方法
Query method with Enum and JPA Repository
我有实体 Driver 和枚举 DriverLanguage。我想通过存储库方法中的参数获取可以说所选语言的驱动程序列表。
...
@Entity
public class Driver{
private Long id;
private firstName;
@ElementCollection(targetClass = DriverLanguage.class)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "driver_language",
joinColumns = @JoinColumn(name = "driver_language_id"))
@Column(name = "driver_language")
private Set<DriverLanguage> languages = new HashSet<>();
}
public enum DriverLanguage {
ENGLISH,
GERMAN
}
现在我正在使用@Query 方法。
我的第一个方法:
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d "
+ "JOIN DriverLanguage dl on d.id = dl.driver_language_id "
+ "WHERE dl.driver_language = ?1")
List<Driver> findByLanguage(String language);
}
ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!
然后我读到也许我不应该使用 JOIN,所以我尝试了这个:
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d, DriverLanguage dl "
+ "WHERE d.id = dl.driver_language_id AND dl.driver_language = ?1")
List<Driver> findByLanguage(String language);
}
ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: DriverLanguage is not mapped
我在这里缺少什么?
直截了当的 JPQL 查询可以是
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d "
+ "WHERE ?1 MEMBER OF d.languages")
List<Driver> findByLanguage(DriverLanguage language);
}
错误消息告诉您:
- 路径是d.languages(属性名)
- DriverLanguage 不是实体
我有实体 Driver 和枚举 DriverLanguage。我想通过存储库方法中的参数获取可以说所选语言的驱动程序列表。
...
@Entity
public class Driver{
private Long id;
private firstName;
@ElementCollection(targetClass = DriverLanguage.class)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "driver_language",
joinColumns = @JoinColumn(name = "driver_language_id"))
@Column(name = "driver_language")
private Set<DriverLanguage> languages = new HashSet<>();
}
public enum DriverLanguage {
ENGLISH,
GERMAN
}
现在我正在使用@Query 方法。
我的第一个方法:
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d "
+ "JOIN DriverLanguage dl on d.id = dl.driver_language_id "
+ "WHERE dl.driver_language = ?1")
List<Driver> findByLanguage(String language);
}
ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join!
然后我读到也许我不应该使用 JOIN,所以我尝试了这个:
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d, DriverLanguage dl "
+ "WHERE d.id = dl.driver_language_id AND dl.driver_language = ?1")
List<Driver> findByLanguage(String language);
}
ERROR: Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: DriverLanguage is not mapped
我在这里缺少什么?
直截了当的 JPQL 查询可以是
@Repository
public interface DriverRepository extends JpaRepository<Driver, Long> {
@Query("SELECT d "
+ "FROM Driver d "
+ "WHERE ?1 MEMBER OF d.languages")
List<Driver> findByLanguage(DriverLanguage language);
}
错误消息告诉您:
- 路径是d.languages(属性名)
- DriverLanguage 不是实体