JPA Query只选择特定的列而不使用Criteria Query?

gupuwyp2  于 2023-04-06  发布在  其他
关注(0)|答案(7)|浏览(186)

是否可以使用JPA查询从对象中只选择属性A和B,而不使用条件查询?
要选择所有属性,我只需执行以下操作:

SELECT i FROM ObjectName i WHERE i.id = 10

但是我有一个对象,在遗留系统上有许多属性,并且希望只选择几个,尽管我知道选择几个属性通常很快。
不使用条件查询是否可能?

pjngdqdw

pjngdqdw1#

是的,就像在普通SQL中一样,你可以指定你想要选择的属性类型:

SELECT i.firstProperty, i.secondProperty FROM ObjectName i WHERE i.id=10

执行此查询将返回Object[]的列表,其中每个数组包含一个对象的选定属性。
另一种方法是将选定的属性 Package 在自定义对象中,并在TypedQuery中执行:

String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();

例子可以在this文章中找到。
更新29.03.2018:
@Krish:
@PatrickLeitermann对我来说它的给予“引起:org.hibernate.hql.internal.ast.QuerySyntaxException:找不到类***”异常,如何解决?
我猜你是在Spring应用程序的上下文中使用JPA的,不是吗?有些人使用的正是the same problem,他们的解决方案是在SELECT NEW关键字后添加完全限定名(例如. com.example.CustomObject)。
也许Spring Data 框架的内部实现只识别用 @Entity 注解的类,或者通过它们的简单名称在特定orm文件中注册的类,这导致使用此解决方案。

jdgnovmf

jdgnovmf2#

你可以使用类似这样的东西:

List<Object[]> list = em.createQuery("SELECT p.field1, p.field2 FROM Entity p").getResultList();

然后你可以迭代它:

for (Object[] obj : list){
    System.out.println(obj[0]);
    System.out.println(obj[1]);
}

但是如果你在查询中只有一个字段,你得到的列表类型不是Object[]

z5btuh9x

z5btuh9x3#

Projections可用于仅选择实体对象的特定属性(列)。
从文件上看
Spring Data Repositories通常在使用查询方法时返回域模型。然而,有时,您可能需要出于各种原因更改该模型的视图。在本节中,您将学习如何定义投影以提供简化和简化的资源视图。
定义一个只包含所需getters的接口。

interface CustomObject {  
    String getA(); // Actual property name is A
    String getB(); // Actual property name is B 
}

现在从仓库返回CustomObject,如下所示:

public interface YOU_REPOSITORY_NAME extends JpaRepository<YOUR_ENTITY, Long> {
    CustomObject findByObjectName(String name);
}
falq053o

falq053o4#

很好的答案!我有一个小补充。关于这个解决方案:

TypedQuery<CustomObject> typedQuery = em.createQuery(query , String query = "SELECT NEW CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=100";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();CustomObject.class);

为了防止出现找不到类的错误,只需插入完整的软件包名称。假设org.company.directory是CustomObject的软件包名称:

String query = "SELECT NEW org.company.directory.CustomObject(i.firstProperty, i.secondProperty) FROM ObjectName i WHERE i.id=10";
TypedQuery<CustomObject> typedQuery = em.createQuery(query , CustomObject.class);
List<CustomObject> results = typedQuery.getResultList();
ny6fqffe

ny6fqffe5#

我想你可以看看这个链接,如果我理解你的问题正确http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_09.html
例如,他们创建了一个查询:

select id, name, age, a.id as ADDRESS_ID, houseNumber, streetName ' +
 20' from person p join address a on a.id = p.address_id where p.id = 1'
0vvn1miw

0vvn1miw6#

是的,这是可能的。您所要做的就是将查询更改为类似SELECT i.foo, i.bar FROM ObjectName i WHERE i.id = 10的内容。查询的结果将是Object数组的List。每个数组中的第一个元素是i.foo的值,第二个元素是i.bar的值。请参阅JPQL参考的相关部分。

wpcxdonn

wpcxdonn7#

我也遇到了同样的问题。我有一个users表,其中有一个id列(主键)和一个name列。我想获取所有记录的name字段,所以我尝试了findNamefindNames,但都不起作用。
我的解决方案是在实体类中创建一个只有getName()方法的接口:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@Table(name = "users")
public class User {
    @Id
    private String id;
    private String name;
    ...

    public interface UserName {
        public String getName();
    }
}

然后在我的JPA存储库中使用“id not null”作为过滤器:

public interface UserRepository extends JpaRepository<User, Integer> {
    ...
    User.UserName findNameByIdNotNull();
}

相关问题