spring data jpa query value in a Set
spring data jpa query value in a Set
我有一个实体 class A,它有一组 class B 的实体,具有多对多关系(超出我需要这个的范围)
class A {
@ManyToMany(cascade = CascadeType.ALL)
Set<B> setOfB;
}
现在,给定一个 class B 的对象,我如何检索 class A 的对象,其集合中有 B 对象??
我已经在我的 class 存储库中尝试过:
interface Arepository extends JpaRepository<A, Long> {
@Query("from A a where ?1 in a.setOfB")
List<A> findByB(B b)
}
但是它给了我一个 SQLGrammarException,那么正确的语法是什么?
感谢您的帮助。
试试 @Query("SELECT a from A a where ?1 member of a.setOfB")
。
元模型class:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(A.class)
public class A_ {
public static volatile SetAttribute<A, B> bSet;
}
规范实用程序:
public class ASpecs {
public static Specification<A> containsB(B b) {
return (root, query, cb) -> {
Expression<Set<B>> bSet = root.get(A_.bSet);
return cb.isMember(b, bSet);
};
}
}
您的存储库:
public interface ARepository extends JpaRepository<A, Long>, JpaSpecificationExecutor<A> {
}
用法:
@Service
public class YourService {
@Resource
private ARepository repository;
public List<A> getByB(B b) {
return repository.findAll(ASpecs.containsB(b));
}
}
我有一个实体 class A,它有一组 class B 的实体,具有多对多关系(超出我需要这个的范围)
class A {
@ManyToMany(cascade = CascadeType.ALL)
Set<B> setOfB;
}
现在,给定一个 class B 的对象,我如何检索 class A 的对象,其集合中有 B 对象??
我已经在我的 class 存储库中尝试过:
interface Arepository extends JpaRepository<A, Long> {
@Query("from A a where ?1 in a.setOfB")
List<A> findByB(B b)
}
但是它给了我一个 SQLGrammarException,那么正确的语法是什么?
感谢您的帮助。
试试 @Query("SELECT a from A a where ?1 member of a.setOfB")
。
元模型class:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(A.class)
public class A_ {
public static volatile SetAttribute<A, B> bSet;
}
规范实用程序:
public class ASpecs {
public static Specification<A> containsB(B b) {
return (root, query, cb) -> {
Expression<Set<B>> bSet = root.get(A_.bSet);
return cb.isMember(b, bSet);
};
}
}
您的存储库:
public interface ARepository extends JpaRepository<A, Long>, JpaSpecificationExecutor<A> {
}
用法:
@Service
public class YourService {
@Resource
private ARepository repository;
public List<A> getByB(B b) {
return repository.findAll(ASpecs.containsB(b));
}
}