gpt4 book ai didi

java - 从 JPA 实体的接口(interface)检索 @NamedQuery

转载 作者:行者123 更新时间:2023-11-30 06:46:15 24 4
gpt4 key购买 nike

我有一个 JPA 2.1 项目,数据库有 2 个表。我创建了一个接口(interface)“UsedClasses.java”,并让两个实体都实现了该接口(interface)。,即

@Entity
@Table(name = "runRanges")
@NamedQuery(name = "RunRange.findAll", query = "SELECT r FROM RunRange r")
public class RunRange extends AbstractTimestampEntity implements UsedClasses, Serializable ....

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User extends AbstractTimestampEntity implements UsedClasses, Serializable ...

我很想知道是否可以使用该界面来获取任一实体的 NamedQuery。如果根据类(class)获取结果列表,我想要完成什么。

    public List<UsedClasses> getAllItems() {
open();
Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));

List<UsedClasses> aList = query.getResultList();
return aList;
}

最佳答案

您可以做到这一点,但您应该使用反射来检索 NamedQuery 注释,并且您需要拥有 UsedClasses 实例,而不是像示例中那样的接口(interface):

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries));

此外,如果添加多个注释,则不再起作用。

我认为一个更简单和干净的解决方案是在界面中添加一个方法来获取namedQuery String名称。
例如

public interface UsedClasses(){
String getNamedQueryForGetAll();
}

你可以这样实现它:

@Entity
@Table(name = "users")
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements UsedClasses(){
public String getNamedQueryForGetAll(){
return "User.findAll";
}
}

然后你可以这样使用它:

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(usedClassInstance.getNamedQueryForGetAll());

现在,我发现它产生了一些重复,而且不可读。
NamedQuery 带来了极其微小的性能提升。
我不确定代码中引入的复杂性/间接级别是否能在执行时间方面获得如此少的时间,从而使您获胜。

关于java - 从 JPA 实体的接口(interface)检索 @NamedQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43643892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com