Doing an “IN” query with Hibernate

后端 未结 3 1107
南方客
南方客 2020-11-30 04:49

I have a list of IDs in a String, and want to use Hibernate to get the rows with these IDs. TrackedItem is a Hibernate/JPA entity (sorry if I\'m getting the nam

相关标签:
3条回答
  • 2020-11-30 05:01

    Even when your query executes correctly, you may face an error if your query parameter contains too many values.

    One possible solution to this problem, if you are using Hibernate 5.1 or newer, is to use Session.byMultipleIds().

    session
        .byMultipleIds(TrackedItem.class)
        .multiLoad(1L, 2L, 3L);
    

    For more information, see https://thoughts-on-java.org/fetch-multiple-entities-id-hibernate/

    0 讨论(0)
  • 2020-11-30 05:25

    If you're unlucky enough to be using older non-JPA hibernate, this should work for you:

    Query query = session.createQuery("FROM TrackedItem item WHERE item.id IN (:items)");
    query.setParameterList("items", Arrays.asList(380L, 382L, 386L));
    
    @SuppressWarnings("unchecked")
    List<TrackedItem> results = query.list();
    
    0 讨论(0)
  • 2020-11-30 05:26

    The syntax of your JPQL query is incorrect. Either use (with a positional parameter):

    List<Long> ids = Arrays.asList(380L, 382L, 386L);
    Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN (?1)");
    query.setParameterList(1, ids)
    List<TrackedItem> items = query.getResultList();
    

    Or (with a named parameter):

    List<Long> ids = Arrays.asList(380L, 382L, 386L);
    Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN :ids");
    query.setParameterList("ids", ids)
    List<TrackedItem> items = query.getResultList();
    

    Below, the relevant sections of the JPA 1.0 specification about parameters:

    4.6.4.1 Positional Parameters

    The following rules apply to positional parameters.

    • Input parameters are designated by the question mark (?) prefix followed by an integer. For example: ?1.
    • Input parameters are numbered starting from 1.
      Note that the same parameter can be used more than once in the query string and that the ordering of the use of parameters within the query string need not conform to the order of the positional parameters.

    4.6.4.2 Named Parameters

    A named parameter is an identifier that is prefixed by the ":" symbol. It follows the rules for identifiers defined in Section 4.4.1. Named parameters are case sensitive.

    Example:

    SELECT c
    FROM Customer c
    WHERE c.status = :stat
    

    Section 3.6.1 describes the API for the binding of named query parameters

    0 讨论(0)
提交回复
热议问题