如何在JPA中查询List< String>类型的属性 [英] How to query a property of type List<String>in JPA

查看:165
本文介绍了如何在JPA中查询List< String>类型的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可以说我们有这个JPA注释的类,有一个List类型的属性。

Lets say we have this JPA-annotated class, with a property of type List. This code is currently working fine.

@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;
    ...
}

有什么方法可以查询列表包含元素yyy的家庭?也就是说,类似于:

Is there any way to query for the list of Families that contain the element "yyy" ? That is, something like:

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


推荐答案

请注意,您正在使用Hibernate的特定功能CollectionOfElements。这不是严格的JPA。你可以使用HQL特定的元素函数来执行此操作:

Note that you are using Hibernate specific feature CollectionOfElements. This is not strictly JPA. You can HQL specific elements function to do this:

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

下面是一个工作示例:

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();
            }
        }
    }

为了完整性, persistence.xml

For the sake of completeness, 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>

这篇关于如何在JPA中查询List&lt; String&gt;类型的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆