2009-12-29 34 views
11

Cho phép nói rằng chúng tôi có lớp được chú thích JPA này, với thuộc tính của Danh sách loại. Mã này hiện đang hoạt động tốt.Cách truy vấn thuộc tính của loại Danh sách <String> trong JPA

@Entity 
public class Family { 
    ... 
    @CollectionOfElements(targetElement=java.lang.String.class) 
    @JoinTable(name = "elements_family", 
     joinColumns = @JoinColumn(name = "idFamily") 
    ) 
    @Column(name = "element", nullable = false) 
    private List<String> elements; 
    ... 
} 

Có cách nào để truy vấn danh sách các gia đình có chứa phần tử "yyy" không? Đó là, một cái gì đó như:

Query query = getEntityManager().createQuery("select f FROM Family f WHERE element = :element"); 
query.setParameter("element", "yyy"); 
return query.getResultList(); 

Trả lời

16

Lưu ý rằng bạn đang sử dụng Hibernate CollectionOfElements tính năng cụ thể. Đây không phải là JPA nghiêm ngặt. Bạn có thể HQL cụ elements chức năng để làm điều này:

select f from Family f WHERE :element in elements(f.elements) 

Dưới đây là một ví dụ làm việc:

import org.hibernate.annotations.CollectionOfElements; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.EntityTransaction; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 
import java.util.Arrays; 
import java.util.List; 

    @Entity 
    public class Family { 
     @Id 
     int id; 

     String name; 

     @CollectionOfElements(targetElement = java.lang.String.class) 
     @JoinTable(name = "elements_family", 
       joinColumns = @JoinColumn(name = "idFamily") 
     ) 
     @Column(name = "element", nullable = false) 
     public List<String> elements; 

     public static void main(String[] args) throws Exception { 
      EntityManagerFactory emf = 
       Persistence.createEntityManagerFactory("mysql"); 
      EntityManager em = emf.createEntityManager(); 
      try { 

       Family f1 = new Family(); 
       f1.id = 1; 
       f1.name = "Happy"; 

       f1.elements = Arrays.asList("foo", "bar", "yyy", "zzz"); 

       Family f2 = new Family(); 
       f1.id = 2; 
       f2.name = "Disfunctional"; 
       f2.elements = Arrays.asList("foo", "bar", "yyy", "xxx"); 

       EntityTransaction tx = em.getTransaction(); 
       tx.begin(); 
       em.persist(f1); 
       em.persist(f2); 
       tx.commit(); 
       Query query = em.createQuery(
        "select f from Family f WHERE :element in elements(f.elements)"); 
       query.setParameter("element", "bar"); 
       List list = query.getResultList(); 
       assert list.size() == 2; 

      } finally { 
       em.close(); 
       emf.close(); 
      } 
     } 
    } 

Vì lợi ích của sự hoàn chỉnh, persistence.xml

<persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL"> 
    <class>jpa.Family</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.connection.driver_class" 
          value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost/test"/> 
     <property name="hibernate.connection.username" value="test"/> 
     <property name="hibernate.connection.password" value="test"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
     <property name="hibernate.max_fetch_depth" value="3"/> 
     <property name="hibernate.bytecode.use_reflection_optimizer" value="true"/> 
     <property name="hibernate.archive.autodetection" value="true"/> 
     <property name="hibernate.cache.use_second_level_cache" value="true"/> 
     <property name="hibernate.generate_statistics" value="true"/> 
     <property name="hibernate.hbm2ddl.auto" value="create"/> 
    </properties> 
</persistence-unit> 
15

THÀNH VIÊN CỦA khoản trong JPQL:

Query query = getEntityManager().createQuery("select f FROM Family f WHERE :element MEMBER OF f.element"); 
query.setParameter("element", "yyy"); 
return query.getResultList(); 
4
List<Family> found = getHibernateTemplate().find(
"from Family as f join f.elements as e where e = ?", 
new Object[]{"yyy"}); 
Các vấn đề liên quan