sql – JPA命名查询匹配IN子句中的元组列表

前端之家收集整理的这篇文章主要介绍了sql – JPA命名查询匹配IN子句中的元组列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Oracle 11g的 spring data jpa 1.4.3.

我有这样一个实体:

  1. class LinkRecord {
  2. String value;
  3. int linkType;
  4. ...
  5. }

我使用(value,linkType)作为复合索引.
对于给定的(v,t)元组列表,我们需要选择DB中的所有记录,以便value = v,linkType = t.

基本上,我想构建此查询

  1. SELECT * FROM LINK_RECORD WHERE (VALUE,LINK_TYPE) IN (('value1',0),('value2',25),...)

IN子句中的列表作为参数传入的位置.

由于我们正在处理大量数据,因此逐个查询元组是非常不可取的.

在我的存储库中我试过这个:

  1. @Query("select r from LinkRecord r where (r.value,r.linkType) in :keys")
  2. List<LinkRecord> findByValueAndType(@Param("keys")List<List<Object>> keys);

其中keys是一个列表(长度为2的列表).这让我得到ORA_00920:无效的关系运算符.

有没有办法使用命名查询来完成这项工作?或者我是否必须使用本机sql

谢谢你的帮助.

解决方法

答案为时已晚,但也许其他人有同样的问题.这是我的一个工作示例.在这里,我需要搜索与给定复合键匹配的所有条目:

实体……

  1. @Entity
  2. @NamedQueries({
  3. @NamedQuery(name = "Article.findByIdAndAccessId",query = "SELECT a FROM Article a WHERE a.articlePk IN (:articlePks) ORDER BY a.articlePk.article")
  4. })
  5. @Table(name = "ARTICLE")
  6. public class Article implements Serializable
  7. {
  8. private static final long serialVersionUID = 1L;
  9.  
  10. @EmbeddedId
  11. private ArticlePk articlePk = new ArticlePk();
  12.  
  13. @Column(name = "art_amount")
  14. private Float amount;
  15.  
  16. @Column(name = "art_unit")
  17. private String unit;
  18.  
  19. public Article()
  20. {
  21. }
  22.  
  23. //more code
  24. }

PK班….

  1. @Embeddable
  2. public class ArticlePk implements Serializable
  3. {
  4. private static final long serialVersionUID = 1L;
  5.  
  6. @Column(name = "art_article")
  7. private String article;
  8.  
  9. @Column(name = "art_acc_identifier")
  10. private Long identifier;
  11.  
  12. public ArticlePk()
  13. {
  14. }
  15.  
  16. public ArticlePk(String article,Long identifier)
  17. {
  18. this.article = article;
  19. this.identifier = identifier;
  20. }
  21.  
  22. @Override
  23. public boolean equals(Object other)
  24. {
  25. if (this == other)
  26. {
  27. return true;
  28. }
  29. if (!(other instanceof ArticlePk))
  30. {
  31. return false;
  32. }
  33.  
  34. ArticlePk castOther = (ArticlePk)other;
  35. return this.article.equals(castOther.article) && this.identifier.equals(castOther.identifier);
  36. }
  37.  
  38. @Override
  39. public int hashCode()
  40. {
  41. final int prime = 31;
  42. int hash = 17;
  43. hash = hash * prime + this.article.hashCode();
  44. hash = hash * prime + this.identifier.hashCode();
  45.  
  46. return hash;
  47. }
  48.  
  49. //more code
  50. }

调用….

  1. TypedQuery<Article> queryArticle = entityManager.createNamedQuery("Article.findByIdAndAccessId",Article.class);
  2. queryArticle.setParameter("articlePks",articlePks);
  3. List<Article> articles = queryArticle.getResultList();

哪里….

articlePks是List< ArticlePk>.

猜你在找的MsSQL相关文章