我有一个名字列表:List<Name>
, Name
有两种方法:
-
toString()
返回“姓名:汤姆” -
getName()
返回“汤姆”
要在数据库中查询具有特定名称的人,我会这样做
// Query a single database entry
Query query = em.createQuery("FROM person WHERE name = :name");
query.setParameter("name", names.get(0).getName());
当我想查询多个条目时(使用 WHERE ... IN (...)
我必须这样做:
// Convert the list of name instances to a list of strings
List<String> nameStrings = new ArrayList<String>(names.size());
for (Name name : names) {
nameStrings.add(name.getName());
}
// Query multiple database entries
Query query = em.createQuery("FROM person WHERE name in (:name)");
query.setParameter("name", nameStrings); // JPA
query.setParameterList("name", nameStrings); // Hibernate
我必须建立第二个列表吗?我宁愿这样做:
// Query a single database entry
Query query = em.createQuery("FROM person WHERE name = :name");
query.setParameter("name", names.get(0));
和
// Query for multiple database entries
Query query = em.createQuery("FROM person WHERE name in (:name)");
query.setParameter("name", names); // JPA
query.setParameterList("name", names); // Hibernate
最佳答案
简短的回答是肯定的,您需要构建第二个列表。您需要提供List
的String
s (或者更确切地说是 Collection
),a List<Name>
永远不会匹配这个。我建议制作某种需要 List<Name>
的实用方法。并返回 List<String>
的名字。
public static List<String> toNameStrings(List<Name> names) {
List<String> list = new ArrayList<String>(names.size());
for (Name name : names) {
list.add(name.getName());
}
return list;
}
我无法测试以下内容,我不确定我是否想以任何方式推荐它,但我认为你可以制作一个 List
实现将根据其所处的状态返回不同的对象类型。使用它您可以执行类似 list.setStringMode(false)
的操作将其用作 List<Name>
(虽然泛型在这个阶段已经被淘汰,但它们都将返回为 Object
),然后 list.setStringMode(true)
,将其用作 List<String>
。它看起来像下面这样:
public class NameAndStringList extends ArrayList<Object> implements List<Object>
{
private boolean stringMode = false;
@Override
public boolean add(Object object)
{
return super.add(toName(object));
}
// Do the same for add(index, element)
// Do the same for set(index, element)
// Do the same for remove(object)
@Override
public boolean addAll(Collection<? extends Object> collection)
{
final List<Name> convertedCollection = new ArrayList<Name>();
for (Object object : collection)
{
convertedCollection.add(toName(object));
}
return super.addAll(convertedCollection);
}
// Do the same for addAll(index, collection)
// Do the same for removeAll(index, collection)
// Do the same for retainAll(index, collection)
@Override
public boolean contains(Object o)
{
return super.contains(toName(o));
}
// Do the same for containsAll(collection)
// Do the same for indexOf(object)
// Implement Iterator that checks the stringMode variable before returning value.
// Override all iterator methods to retrieve custom Iterator implementation.
// Override subList(fromIndex, toIndex) to make subList be an instance of NameAndStringList as well.
@Override
public Object get(int index)
{
if (stringMode)
{
return ((Name) super.get(index)).getName();
}
return super.get(index);
}
// Implement setStringMode(boolean)
protected Object toNameString(Object object)
{
if (object instanceof Name)
{
// Convert to String here
}
return object;
}
protected Name toName(Object object)
{
if (object instanceof String)
{
// Convert to Name here.
}
return object;
}
}
请注意,这依赖于您能够转换 String
到 Name
反之亦然,但如果您知道自己总是会使用 Name
填充它,那么您总是可以删除该位。实例。这里的总体思路是 List
商店Name
实例,但可以自由返回 String
实例,因为它是 List<Object>
。再说一次,我不确定我是否会推荐这种方法,但它应该满足您的要求,或者至少尽可能接近我能得到的 atm。
关于java - Hibernate 查询调用 toString() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12069007/