【问题标题】:spring data jpa query value in a Set集合中的spring数据jpa查询值
【发布时间】:2015-04-03 11:57:46
【问题描述】:

我有一个实体类 A,它有一组具有多对多关系的 B 类实体(超出了我需要这个的范围)

class A {

    @ManyToMany(cascade = CascadeType.ALL)
    Set<B> setOfB;
}

现在,给定一个 B 类的对象,我如何检索在其 Set 中有 B 对象的 A 类的对象??

我已经在我的 A 类存储库中尝试过:

interface Arepository extends JpaRepository<A, Long> {

    @Query("from A a where ?1 in a.setOfB")
    List<A> findByB(B b)
}

但它给了我一个 SQLGrammarException,那么正确的语法是什么?

感谢您的帮助。

【问题讨论】:

  • 你能试试@Query("from A a where ?1 member of a.setOfB")吗?
  • 你拯救了我的一天......你看我对 SQL 的理解并不像你可能理解的那样......非常感谢你编辑:废话......我赞成你的评论,但是犯了错误我已经撤消了它,现在它不允许我再次投票!!!真的很抱歉,我怎样才能再次投票给你?
  • 糟糕,您在 JPQL 查询的开头错过了“SELECT a”。毕竟 JPQL 不能像 JPA 规范所说的那样从“FROM”开始
  • @NeilStockton 真的吗?我知道在 SQL 查询中我当然必须有选择,但是在使用 spring 的情况下,我可以省略它,并且它可以工作。例如,Predrag 建议的查询在没有 'select' 的情况下工作......请注意,我传递的参数是 ":b" [findBy(@Param("b")B b)] 而不是 ?1
  • JPQL != SQL。 JPQL!= HQL。您将问题标记为 JPA,而不是 Hibernate(或 HQL),所以不,它在 other JPA 实现中不起作用,并且任何声称适用于 JPQL 的文档都应该始终具有“SELECT {alias}” (和 JPA 规范一样)

标签: java spring jpa spring-data spring-data-jpa


【解决方案1】:

试试@Query("SELECT a from A a where ?1 member of a.setOfB")

【讨论】:

  • 我也不知道成员,因为我总是使用规范进行此类数据检索。
  • JPA specification,查看第4.6.13节
  • @HarshalPatil 只是出于好奇,你是怎么做到的?
  • @Johnny 我曾经使用规范来编写谓词。
【解决方案2】:

元模型类:

@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));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2014-08-01
    • 2018-07-25
    • 2019-04-01
    相关资源
    最近更新 更多