2012-05-11 46 views
0

我嘗試使用Hibernate遵循的chapter 9Hibernate的元組標準查詢

的差額部分9.2和我試圖給出的例子來創建一個查詢是我使用Spring MVC的3.0。這是我的地址類以及我創建的方法。

@RooJavaBean 
@RooToString 
@RooEntity 
@RooJson 
public class Address { 

    @NotNull 
    @Size(min = 1) 
    private String street1; 

    @Size(max = 100) 
    private String street2; 

    private String postalcode; 

    private String zipcode; 

    @NotNull 
    @ManyToOne 
    private City city; 

    @NotNull 
    @ManyToOne 
    private Country country; 

    @ManyToOne 
    private AddressType addressType; 

    @Transient 
    public static List<Tuple> jqgridAddresses(Long pID){ 
     CriteriaBuilder builder = Address.entityManager().getCriteriaBuilder(); 
     CriteriaQuery<Tuple> criteria = builder.createTupleQuery(); 
     Root<Address> addressRoot = criteria.from(Address.class); 
     criteria.multiselect(addressRoot.get("id"), addressRoot.get("street1"), addressRoot.get("street2")); 
     criteria.where(builder.equal(addressRoot.<Set<Long>>get("id"), pID)); 
     return Address.entityManager().createQuery(criteria).getResultList(); 
    } 
} 

上述方法稱爲jqgridAddresses是重點。我選擇不使用「路徑」,因爲當我說類似Path idPath = addressRoot.get(Address_.id);如文檔9.2節所述,PathAddress_.id東西會產生編譯錯誤。

上面的方法返回一個類型爲Tuple的空列表,因爲它的大小爲零,即使它應該包含某些東西。這表明查詢失敗。有人可以請教我。

回答

1

好的,所以我對我的邏輯進行了一些小的調整,這是我的項目特定的,但是,下面的方法完美地工作。希望它能幫助有需要的人!

@Transient 
public static List<Tuple> jqgridPersons(Boolean isStudent, String column, String orderType, int limitStart, int limitAmount){ 
    CriteriaBuilder builder = Person.entityManager().getCriteriaBuilder(); 
    CriteriaQuery<Tuple> criteria = builder.createTupleQuery(); 
    Root<Person> personRoot = criteria.from(Person.class); 
    criteria.select(builder.tuple(personRoot.get("id"), personRoot.get("firstName"), personRoot.get("lastName"), personRoot.get("dateOfBirth"), personRoot.get("gender"), personRoot.get("maritalStatus"))); 
    criteria.where(builder.equal(personRoot.get("isStudent"), true)); 
    if(orderType.equals("desc")){ 
     criteria.orderBy(builder.desc(personRoot.get(column))); 
    }else{ 
     criteria.orderBy(builder.asc(personRoot.get(column))); 
    } 
    return Address.entityManager().createQuery(criteria).setFirstResult(limitStart).setMaxResults(limitAmount).getResultList(); 
}