2017-07-20 24 views
6

Đây là câu hỏi tôi muốn đạt được:Tiêu chuẩn nhóm công ty xây dựng và có đếm không hoạt động

SELECT * 
FROM ROOMENTITY R 
JOIN CALENDARENTITY C ON R.id = C.room_id 
WHERE C.available = TRUE AND 
     C.date BETWEEN :checkin AND 
     :checkout 
GROUP BY C.room_id 
HAVING COUNT(C.room_id)>= diffdays 

Đây là mã của tôi:

manager = factory.createEntityManager(); 
boolean hasPredicates = false; 
final CriteriaBuilder criteriaBuilder = manager.getCriteriaBuilder(); 

final CriteriaQuery<RoomEntity> q = criteriaBuilder.createQuery(RoomEntity.class); 

List<Predicate> predicates = new ArrayList<Predicate>(); 

Root<RoomEntity> fromRooms = q.from(RoomEntity.class); 
String checkinDate = filter.getCheckinDate(); 
String checkoutDate = filter.getCheckoutDate(); 
if (checkinDate != null || checkoutDate != null) { 
    hasPredicates = true; 
    java.sql.Date checkin = java.sql.Date.valueOf(filter.getCheckinDate()); 
    java.sql.Date checkout = ava.sql.Date.valueOf(filter.getCheckoutDate()); 
    int diffInDays = (int)((checkout.getTime() - checkin.getTime())/(1000 * 60 * 60 * 24)) + 1; 
    System.out.println("Days: " + diffInDays); 
    Join<RoomEntity, CalendarEntity> calendarEntityJoin= fromRooms.join("calendarEntities", JoinType.INNER); 
    calendarEntityJoin.on(
         criteriaBuilder.equal(calendarEntityJoin.join("calendarId").<Integer>get("room_id"), fromRooms.<Integer>get("id")) 
       ); 
    predicates.add(criteriaBuilder.and(
         criteriaBuilder.equal(calendarEntityJoin.<String>get("available"), true), 
         criteriaBuilder.between(calendarEntityJoin.join("calendarId").<Date>get("date"), 
           checkin, checkout) 
       )); 
    q.groupBy(calendarEntityJoin); 
    q.having(criteriaBuilder.gt(criteriaBuilder.count(fromRooms), diffInDays)); 
} 

My Room Entity:

public class RoomEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "id", nullable = false, unique = true) 
    private Integer id; 

    @OneToMany(mappedBy = "roomEntity", cascade = CascadeType.ALL) 
    private Collection<CalendarEntity> calendarEntities; 
} 

Lịch của tôiTính số:

public class CalendarEntity { 

@EmbeddedId 
private CalendarId calendarId; 

@Basic 
@Column(name = "available", nullable = false) 
private Boolean available; 

@ManyToOne 
@JoinColumn(name = "room_id", referencedColumnName = "id", insertable = false, updatable = false) 
private RoomEntity roomEntity; 
} 

CalendarEntity My Embedded id:

@Embeddable 
public class CalendarId implements Serializable { 

    @Column(name= "date", nullable = false) 
    private Date date; 

    @Column(name = "room_id", nullable = false) 
    private Integer room_id; 
} 

Mọi thứ đều tốt cho đến nhóm bằng và có đếm. Khi tôi chạy điều này và tôi in truy vấn bằng mã này bên dưới, khi đó có nhóm/có:

if (hasPredicates) 
      q.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))); 
final TypedQuery<RoomEntity> TQ = manager.createQuery(q); 
TQ.setFirstResult(filter.getStart()); 
TQ.setMaxResults(filter.getSize()); 
System.out.println("\n\nQuery:\n" + +Q.unwrap(JpaQuery.class).getDatabaseQuery().getSQLString() + "\n\n\n"); 

Truy vấn cuối cùng không phải là những gì tôi muốn và nó thực hiện theo và đếm.

UPDATE: Đây là câu hỏi tôi nhận được ngay bây giờ:

SELECT t1.id, t1.bathrooms, t1.bedrooms, t1.beds, t1.description, t1.exta_person_price, t1.house_rules, t1.max_people, t1.min_overnights, t1.neightborhood, t1.overnight_price, t1.square_meters, t1.title, t1.transport, t1.room_host, t1.room_location, t1.room_type_id FROM CALENDARENTITY t0, ROOMENTITY t1 WHERE (((t0.available = ?) AND (t0.date BETWEEN ? AND ?)) AND ((t0.room_id = t1.id) AND (t0.room_id = t1.id))) ORDER BY t1.overnight_price ASC 

Nó là mất tích nhóm bằng và có đếm!

+0

Thêm một số thông tin về kết quả dự kiến ​​hoặc lỗi bạn đang nhận được. –

+0

Điều tôi mong đợi là truy vấn hàng đầu sẽ được tạo ra, nhưng cuối cùng những gì đang được tạo ra là truy vấn hàng đầu với 2 dòng cuối cùng, nhóm và đếm. – peterthunder

+0

Bạn đã kiểm tra xem bạn đã tạo đúng thực thể chưa, sử dụng các chú thích thích hợp mà bạn không cần viết nhiều mã. Ngoài ra, hãy xác minh truy vấn bạn đang cố gắng tạo, nó có thể dễ dàng sửa đổi để thực hiện cùng một công việc theo cách gọn gàng hơn. –

Trả lời

5

Truy vấn đã hoạt động sau khi tôi sử dụng tính năng chọn nhiều.

Q.multiselect(fromRooms); 
Các vấn đề liên quan