How to fetch only selected attributes of an entity using Spring JPA?



I’m using Spring Boot (1.3.3.RELEASE) and Hibernate JPA in my project. My entity looks like this:

@Table(name = "rule")
public class RuleVO {

    private Long id;

    @Column(name = "name", length = 128, nullable = false, unique = true)
    private String name;

    @Column(name = "tag", length = 256)
    private String tag;

    @OneToMany(mappedBy = "rule", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<RuleOutputArticleVO> outputArticles;

    @OneToMany(mappedBy = "rule", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<RuleInputArticleVO> inputArticles;

My repository looks like this:

public interface RuleRepository extends JpaRepository<RuleVO, Long> {

In some cases I need to fetch only id and name attributes of entity RuleVO. How can I achieve this? I found a notice it should be doable using Criteria API and Projections but how? Many thanks in advance. Vojtech



As has been pointed out to me, I’m lazy and this can very well be done hence I’m updating my answer after having looked around the web for a proper one.

Here’s an example of how to get only the id’s and only the names:

public interface RuleRepository extends JpaRepository<RuleVO, Long> {

    @Query("SELECT FROM RuleVo r where = :name") 
    List<Long> findIdByName(@Param("name") String name);

    @Query("SELECT FROM RuleVo r where = :id") 
    String findNameById(@Param("id") Long id);

Hopefully this update proves helpful

Old Answer:

Only retrieving the specific attributes name/id is not possible as this is not how spring was designed or any SQL database for that matter as you always select a row which is an entity.

What you CAN do is query over the variables in the entity, for instance:

public interface RuleRepository extends JpaRepository<RuleVO, Long> {

    public RuleVo findOneByName(String name);
    public RuleVo findOneByNameOrId(String name, Long id);
    public List<RuleVo> findAllByName(String name);
    // etc, depending on what you want

You can modify these however you want w.r.t. your needs. You can call these methods directly via the autowired repository

See Section 5.3 for more options and examples

Answered By – Roel Strolenberg

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave A Reply

Your email address will not be published.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More