【问题标题】:SELECT in Criteria Queries标准查询中的 SELECT
【发布时间】:2012-08-24 17:59:17
【问题描述】:

例如,我有这个课程:

public class Person {
    private Integer id;  
    private String name;  
    private Address address;  
}

public class Address {
    private Integer id;  
    private String street;  
    private String number;      

    ...
}

我想在 JPA 中为此 SQL 构建 CriteriaQuery

select p.name, d.street from Person p join Address d on d = p.address;  

对于这种特殊情况,我是否必须为 Person 类和 Address 类创建构造函数?

谢谢。

【问题讨论】:

    标签: select jpa criteria multi-select


    【解决方案1】:

    您的where 条件无效:

    select p.name, d.street from Person p join Address d on d = p.address;  
    

    应该是这样的:

    select p.name, d.street from Person p join Address d on d.person_id = p.id;  
    

    或:

    select p.name, d.street from Person p join Address d on d.id = p.address_id;  
    

    以及 Person 类的构造函数示例:

    //cTor I
    public Person(Integer id, String name, Address address){
        this.id = id;
        this.name = name;
        this.address = address;
    }
    
    //cTor II
    public Person(Integer id, String name, Integer addressId, String street, String number){
        this.id = id;
        this.name = name;
        this.address = new Address(addressId, street, number);
    }
    

    【讨论】:

    • 好的,谢谢您的回答。现在如何使用此 JPQL 制定标准?
    【解决方案2】:

    来自 JPQL select p.name, d.street from Person p join Address d on d = p.address; 目标标准

    带有构造函数的选项:

    首先在您的实体中标记关系 @OneToOne/@OneToMany 等等。 使用@JoinColumn 即

        public class Person {
               private Integer id;  
               private String name;  
    
               @JoinColumn(name="id", referencedColumnName = "id")
               private Address address;  
    }
    

    稍后 为您的结果类型创建一个类

          public class Result(){
               String name;
                String street;
    
             /* you must have constructor here for the multi select later */
             public Result(String name,String street) {
                this.name = name;
                thi.street = street
             }
          }
    

    然后做(em 是实体管理器)

          CriteriaBuilder cb = em.getCriteriaBuilder();
          CriteriaQuery<PlaceSearch> query = cb.createQuery(PlaceSearch.class);
      Root<Person> personRoot = query.from(Person .class);
      Join<Person, Address> address= personRoot .join(Person_.address);
    
          / * without meta model 
      Join<Person, Address> address= personRoot .join(person.get("address"));
          */
    /* we know Result has a construct of (String,String) . this is important for the                        multi select here */
    
    query.multiselect(person.get(Person_.name),address.get(Address_.street);
    List<Result> result = em.
    

    createQuery(query).getResultList();

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多