Java 如何在 JPA 中查询 List<String> 类型的属性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1976422/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to query a property of type List<String>in JPA
提问by Guido
Lets say we have this JPA-annotated class, with a property of type List. This code is currently working fine.
假设我们有这个带有 JPA 注释的类,它有一个 List 类型的属性。此代码目前工作正常。
@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;
...
}
Is there any way to query for the list of Families that contain the element "yyy" ? That is, something like:
有没有办法查询包含元素“yyy”的家庭列表?也就是说,类似于:
Query query = getEntityManager().createQuery("select f FROM Family f WHERE element = :element");
query.setParameter("element", "yyy");
return query.getResultList();
采纳答案by Chandra Patni
Note that you are using Hibernate specific feature CollectionOfElements. This is not strictly JPA. You can HQL specific elements
function to do this:
请注意,您正在使用 Hibernate 特定功能 CollectionOfElements。这不是严格的 JPA。您可以使用 HQL 特定elements
功能来执行此操作:
select f from Family f WHERE :element in elements(f.elements)
Here is a working example:
这是一个工作示例:
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();
}
}
}
For the sake of completeness, persistence.xml
为了完整起见,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>
回答by axtavt
MEMBER OF clause in JPQL:
JPQL 中的 MEMBER OF 子句:
Query query = getEntityManager().createQuery("select f FROM Family f WHERE :element MEMBER OF f.element");
query.setParameter("element", "yyy");
return query.getResultList();
回答by MaximR
List<Family> found = getHibernateTemplate().find(
"from Family as f join f.elements as e where e = ?",
new Object[]{"yyy"});