【问题标题】:Hibernate IN Clause with multiple columns具有多列的休眠 IN 子句
【发布时间】:2013-02-15 14:41:35
【问题描述】:

需要知道如何构造一个 Hibernate 查询,该查询获取与包含多个列值的 IN 子句匹配的结果。

例如,

Query query=session.createQuery( "from entity e where (e.abc, e.xyz) in (:list)" );
query.setParameterList( "list", list );

这里的list 是一个二维数组,可以包含基本类型的基本包装对象,例如IntegerString 等。

这可能吗?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    在这里写下我是如何实现的。基本上,我们需要从我们需要查询的列集合中创建一个 Hibernate 组件(读取 @Embeddable 对象)并将其嵌入到主实体中。

    列组可以如下组合:

    @Embeddable
    public class CompositeColumns{
      private String col1;
      private String col2;
    
      //Empty constructor is required by Hibernate for instantiation
      public CompositeColumns(){
      }
    
      public CompositeColumns(String col1, String col2){
                this.col1 = col1;
                this.col2 = col2;
          }
    
      @Column(name="COL1")
      public String getCol1(){
      }
      ...
      ... 
      //Rest of getters and setters
    }
    



    将上述内容嵌入到您的主要实体类中,如下所示:

    @Entity
    public class MyEntity{
     @Id
     private Integer id;
     private String col3;
     private String col4
     @Embedded
     private CompositeColumns pairedCol1Col2;
     ...
     ...
     //Getters Setters
    
    }
    



    查询将如下所示:

    List<CompositeColumns> cols = //get a list of CompositeColumns type
    
    Query query=session.createQuery( "from MyEntity where pairedCol1Col2 in (:list)" );
    query.setParameterList( "list", list );
    


    这样就可以了。

    注意:我是在 Oracle 数据库上运行的

    【讨论】:

    • 在 MySQL 上试过这个,它可以工作。如果您计划保留实体中的原始列以进行 CRUD 操作,唯一要记住的是在 @Embeddable@Columns 上添加 updateable = false, insertable = false
    【解决方案2】:

    你在这里问的是元组语法。 Hibernate 支持它,但不幸的是许多数据库不支持它...

    http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-tuple

    【讨论】:

    • 在这种情况下你能显示声明列表的语法吗?
    【解决方案3】:

    实体类 - 在@Embeddable 类中创建多个可搜索列,如下所述。

    @Entity
    @Table(name="channels_store_images")
    @Data
    public class ChannelsStoreImages {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      @Column(name="id")
      private Integer id;
    
      @Embedded
      private CompositeColumns compositeColumns;
    
      @Embeddable
      @Data
      @AllArgsConstructor
      public static class CompositeColumns {
        @Column(name="partner_id")
        private String partnerId;
        @Column(name="entity_type")
        private String entityType;
        public CompositeColumns(){
        }
      }
    }
    

    然后创建@Embeddable 类的对象并按如下所述点击查询

    public List<ChannelsStoreImages> getChannelsStoreImagesByPartnerIdAndType(List<ChannelsStoreImages.CompositeColumns> shopIdAndType) { 
      Query dbQuery =  masterEntityManager.createQuery("From ChannelsStoreImages 
                   where compositeColumns IN (:query)",ChannelsStoreImages.class);
      dbQuery.setParameter("query",shopIdAndType);
      List<ChannelsStoreImages> channelsStoreImagesList = dbQuery.getResultList();
      return channelsStoreImagesList;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2012-09-06
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多