web-development-kb-asia.site

Truy vấn ngủ đông theo ví dụ và dự đoán

Nói ngắn gọn: hibernate không hỗ trợ các phép chiếu và truy vấn bằng ví dụ? Tôi tìm thấy bài này:

Mã này là:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr))

Giống như các poster khác đã nói, sql được tạo tiếp tục có một lớp tham chiếu đến chỉ y0_ =? thay vì this_.city

Tôi đã thử một vài cách tiếp cận và tìm kiếm theo dõi vấn đề nhưng không tìm thấy gì về điều này.

Tôi thậm chí đã thử sử dụng bí danh Projection và Transformers, nhưng nó không hoạt động:

User usr = new User();
usr.setCity = 'TEST';
getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class));

Có ai đã sử dụng các phép chiếu và truy vấn bằng ví dụ chưa?

21
Miguel Ping

Tôi có thể xem lớp Người dùng của bạn không? Đây chỉ là sử dụng các hạn chế dưới đây. Tôi không thấy lý do tại sao Hạn chế sẽ thực sự khác với Ví dụ (Tôi nghĩ rằng các trường null được mặc định bỏ qua trong các ví dụ).

getCurrentSession().createCriteria(User.class)
.setProjection( Projections.distinct( Projections.projectionList()
.add( Projections.property("name"), "name")
.add( Projections.property("city"), "city")))
.add( Restrictions.eq("city", "TEST")))
.setResultTransformer(Transformers.aliasToBean(User.class))
.list();

Tôi chưa bao giờ sử dụng alaistToBean, nhưng tôi chỉ đọc về nó. Bạn cũng có thể chỉ cần lặp lại kết quả ..

List<Object> rows = criteria.list();
for(Object r: rows){
  Object[] row = (Object[]) r;
  Type t = ((<Type>) row[0]);
}

Nếu bạn phải tự mình có thể tự điền Người dùng theo cách đó.

Thật khó để xem xét vấn đề mà không có thêm thông tin để chẩn đoán vấn đề.

16
Arthur Thomas

Vấn đề dường như xảy ra khi bạn có một bí danh cùng tên với thuộc tính đối tượng. Hibernate dường như chọn bí danh và sử dụng nó trong sql. Tôi đã tìm thấy tài liệu này ở đâyở đây , và tôi tin rằng đó là một lỗi trong Hibernate, mặc dù tôi không chắc rằng nhóm Hibernate đồng ý.

Dù bằng cách nào, tôi đã tìm thấy một công việc đơn giản xung quanh hoạt động trong trường hợp của tôi. Số dặm của bạn có thể thay đổi. Các chi tiết bên dưới, tôi đã cố gắng đơn giản hóa mã cho mẫu này để tôi xin lỗi vì bất kỳ lỗi hoặc lỗi đánh máy nào:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Sẽ sản xuất sql này:

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(y1_) like ? ) 

Điều này đã gây ra lỗi: Java.sql.SQLException: ORA-00904: "Y1_": định danh không hợp lệ

Nhưng, khi tôi thay đổi hạn chế sử dụng "cái này", như vậy:

Criteria criteria = session.createCriteria(MyClass.class)
    .setProjection(Projections.projectionList()
        .add(Projections.property("sectionHeader"), "sectionHeader")
        .add(Projections.property("subSectionHeader"), "subSectionHeader")
        .add(Projections.property("sectionNumber"), "sectionNumber"))
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved!
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class));

Nó tạo ra sql sau và vấn đề của tôi đã được giải quyết.

select
    this_.SECTION_HEADER as y1_,
    this_.SUB_SECTION_HEADER as y2_,
    this_.SECTION_NUMBER as y3_,
from
    MY_TABLE this_ 
where
    ( lower(this_.SECTION_HEADER) like ? ) 

Đó là nó! Một sửa chữa khá đơn giản cho một vấn đề đau đớn. Tôi không biết cách khắc phục này sẽ chuyển sang truy vấn bằng ví dụ vấn đề, nhưng nó có thể giúp bạn tiến gần hơn.

44
Ryan Cook

Vấn đề thực sự ở đây là có một lỗi trong chế độ ngủ đông nơi nó sử dụng các bí danh danh sách chọn trong mệnh đề where:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

Chỉ trong trường hợp ai đó hạ cánh ở đây để tìm câu trả lời, hãy nhìn vào vé. Phải mất 5 năm để khắc phục nhưng về lý thuyết, nó sẽ nằm trong một trong những phiên bản tiếp theo và sau đó tôi nghi ngờ vấn đề của bạn sẽ biến mất.

6
Dobes Vandermeer

Tôi đang đối mặt với một vấn đề tương tự. Tôi đang sử dụng Truy vấn theo ví dụ và tôi muốn sắp xếp kết quả theo trường tùy chỉnh. Trong SQL tôi sẽ làm một cái gì đó như:

select pageNo, abs(pageNo - 434) as diff
from relA
where year = 2009
order by diff

Nó hoạt động tốt mà không có mệnh đề theo thứ tự. Những gì tôi nhận được là

Criteria crit = getSession().createCriteria(Entity.class);
crit.add(exampleObject);
ProjectionList pl = Projections.projectionList();
pl.add( Projections.property("id") );
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types ));
crit.setProjection(pl);

Nhưng khi tôi thêm 

crit.addOrder(Order.asc("diff"));

Tôi nhận được một org.hibernate.QueryException: không thể giải quyết thuộc tính: diff ngoại lệ. Giải pháp thay thế với cái này cũng không hoạt động. 

PS: vì tôi không thể tìm thấy bất kỳ tài liệu chi tiết nào về việc sử dụng QBE cho Hibernate, tất cả những thứ ở trên chủ yếu là phương pháp thử và sai

0
VHristov
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("id"));
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types ), diff); ---- solution
crit.addOrder(Order.asc("diff"));
crit.setProjection(pl);
0
singh