2011-12-22 25 views
8

Tôi cần tạo truy vấn và tôi cần COUNT(*)HAVING COUNT(*) = x.CÁCH SỬ DỤNG CÓ COUNT (*) với hibernate

Tôi đang sử dụng một tác phẩm xung quanh sử dụng lớp CustomProjection mà tôi đã tải xuống ở đâu đó.

Đây là SQL mà tôi cố gắng để đạt được:

select count(*) as y0_, this_.ensayo_id as y1_ from Repeticiones this_ 
inner join Lineas linea1_ on this_.linea_id=linea1_.id 
where this_.pesoKGHA>0.0 and this_.nroRepeticion=1 and linea1_.id in (18,24) 
group by this_.ensayo_id 
having count(*) = 2 

Đây là mã, nơi tôi sử dụng lớp Projection Hibernate:

critRepeticion.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("ensayo")) 
       .add(CustomProjections.groupByHaving("ensayo_id",Hibernate.LONG,"COUNT(ensayo_id) = "+String.valueOf(lineas.size())) 
       .add(Projections.rowCount()) 
       ); 

Lỗi này là:

!STACK 0 
java.lang.NullPointerException 
at org.hibernate.criterion.ProjectionList.toSqlString(ProjectionList.java:50) 
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getSelect(CriteriaQueryTranslator.java:310) 
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:71) 
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550) 
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) 
at ar.com.cse.cseagro.controller.RepeticionController.buscarEnsayo(RepeticionController.java:101) 

Nếu tôi nhận xét dòng có lớp là CustomProjections, công việc truy vấn, nhưng tôi không nhận được bộ lọc HAVING COUNT(*) trong SQL ...

Về cơ bản truy vấn cố gắng truy xuất, trong lược đồ chi tiết chính, tất cả bản ghi chủ nơi danh sách chi tiết đồng thời hiện tại, như nếu bạn muốn biết cả hai sản phẩm, A và B ".

Đó là lý do tại sao nếu tôi có 3 mục trong mệnh đề IN, tôi cần sử dụng mệnh đề HAVING COUNT = 3.

Bất kỳ ý tưởng hoặc đề xuất nào? Trân trọng,

+0

Xin lỗi, tôi đã tìm ra vấn đề. Tôi thay thế lớp CusotmProjections, với: .add (Projections.sqlGroupProjection ("ensayo_id", groupBy, bí danh, loại)), trong đó groupBy, bí danh và loại là: \t \t \t Chuỗi nhómBy = "ensayo_id" + "có" + "đếm (*) =" + String.valueOf (lineas. kích thước()); \t \t \t Chuỗi [] alias = new String [1]; \t \t \t bí danh [0] = "ensayo_id"; \t \t \t Nhập [] types = new Type [1]; \t \t \t loại [0] = Hibernate.INTEGER; và phép thuật nằm trên chuỗi nhóm. – Nicolas400

Trả lời

9

Tôi đã tìm ra sự cố. Tôi thay thế CusotmProjections lớp, với:

.add(Projections.sqlGroupProjection("ensayo_id", groupBy , alias, types)); 

nơi groupby, bí danh và các loại bao gồm:

String groupBy = "ensayo_id" + " having " + "count(*) = " + String.valueOf(lineas.size()); 
String[] alias = new String[1]; 
Alias[0] = "ensayo_id"; 
Type[] types = new Type[1]; 
types[0] = Hibernate.INTEGER; 

và sự kỳ diệu là trên Chuỗi groupby. -

1

Nếu ai đó cần phải làm điều đó trong grails nó sẽ như thế nào:

projections { 
    groupProperty("id") 
    sqlGroupProjection(...) 
    rowCount() 
} 

đâu sqlGroupProjection có sẵn từ 2.2.0

/** 
* Adds a sql projection to the criteria 
* 
* @param sql SQL projecting 
* @param groupBy group by clause 
* @param columnAliases List of column aliases for the projected values 
* @param types List of types for the projected values 
*/ 
protected void sqlGroupProjection(String sql, String groupBy, List<String> columnAliases, List<Type> types) { 
    projectionList.add(Projections.sqlGroupProjection(sql, groupBy, columnAliases.toArray(new String[columnAliases.size()]), types.toArray(new Type[types.size()]))); 
} 

http://grepcode.com/file/repo1.maven.org/maven2/org.grails/grails-hibernate/2.2.0/grails/orm/HibernateCriteriaBuilder.java/#267

0

criteria.add (Restrictions .sqlRestriction ("1 = 1 có số đếm (*) = 2"));

2

Đây là mẫu của tôi, nó hoạt động tốt, có thể hữu ích:

tôi truy vấn sql:

chọn COLUMN1, sum (--COLUMN2) từ nhóm MY_TABLE bởi COLUMN1 có sum (--COLUMN2)> 1000 ;

Và Tiêu chuẩn sẽ là:

Criteria criteria = getCurrentSession().createCriteria(MyTable.Class); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.property("column1"), "column1"); 
    projectionList.add(Projections.sqlGroupProjection("sum(column2) sumColumn2 ", "COLUMN1 having sum(COLUMN2) > 1000" , new String[]{"sumColumn2"}, new org.hibernate.type.Type[]{StandardBasicTypes.STRING})); 
    criteria.setProjection(projectionList); 
    criteria.List(); 
Các vấn đề liên quan