【问题标题】:Hibernate tuple criteria queriesHibernate 元组条件查询
【发布时间】:2012-05-11 15:09:50
【问题描述】:

我正在尝试按照chapter 9 的第 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”,因为当我在文档的第 9.2 节中说 Path idPath = addressRoot.get(Address_.id); 时, PathAddress_.id 东西会产生编译错误。

上面的方法返回一个Tuple 类型的空列表,因为它的大小为零,即使它应该包含一些东西。这表明查询失败。谁能给我建议。

【问题讨论】:

    标签: spring hibernate jpa jboss hibernate-criteria


    【解决方案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(); 
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2015-01-11
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多