<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Alexander</title><subtitle>Записки новичка по Java и всему, что с ним связано</subtitle><author><name>Alexander</name></author><id>https://teletype.in/atom/eska2000</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/eska2000?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@eska2000?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=eska2000"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/eska2000?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-25T19:58:05.613Z</updated><entry><id>eska2000:wr3cXW22XfO</id><link rel="alternate" type="text/html" href="https://teletype.in/@eska2000/wr3cXW22XfO?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=eska2000"></link><title>Spring Data, Hibernate: Пересечение множеств и запрос во вложенные параметры</title><published>2021-08-15T13:48:41.515Z</published><updated>2021-08-15T13:48:41.515Z</updated><summary type="html">Есть сущности (показаны базовые поля):</summary><content type="html">
  &lt;p&gt;Есть сущности (показаны базовые поля):&lt;/p&gt;
  &lt;p&gt;ApplicationUser&lt;/p&gt;
  &lt;pre data-lang=&quot;java&quot;&gt;@Entity
@Table(name = &amp;quot;application_user&amp;quot;)
@Data
public class ApplicationUser {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &amp;quot;sequenceGenerator&amp;quot;)
    @SequenceGenerator(name = &amp;quot;sequenceGenerator&amp;quot;)
    private Long id;

    @Column(name = &amp;quot;is_active&amp;quot;)
    private Boolean isActive;

    @Column(name = &amp;quot;second_name&amp;quot;)
    private String secondName;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(unique = true)
    private User user;

}&lt;/pre&gt;
  &lt;p&gt;User&lt;/p&gt;
  &lt;pre data-lang=&quot;java&quot;&gt;@Entity
@Table(name = &amp;quot;sys_user&amp;quot;)
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = &amp;quot;sequenceGenerator&amp;quot;)
    @SequenceGenerator(name = &amp;quot;sequenceGenerator&amp;quot;)
    private Long id;

    @NotNull
    @Email
    @Size(min = 5, max = 254)
    @Column(name = &amp;quot;email&amp;quot;, length = 254, unique = true, nullable = false)
    private String email;

    @ManyToMany
    @JoinTable(
            name = &amp;quot;sys_user_authority&amp;quot;,
            joinColumns = { @JoinColumn(name = &amp;quot;user_id&amp;quot;, referencedColumnName = &amp;quot;id&amp;quot;) },
            inverseJoinColumns = { @JoinColumn(name = &amp;quot;authority_name&amp;quot;, referencedColumnName = &amp;quot;name&amp;quot;) }
    )
    @BatchSize(size = 20)
    private Set&amp;lt;Authority&amp;gt; authorities = new HashSet&amp;lt;&amp;gt;();

}&lt;/pre&gt;
  &lt;p&gt;Authority&lt;/p&gt;
  &lt;pre data-lang=&quot;java&quot;&gt;@Entity
@Table(name = &amp;quot;authority&amp;quot;)
@Data
public class Authority {

    @NotNull
    @Size(max = 50)
    @Id
    @Column(length = 50)
    private String name;

}&lt;/pre&gt;
  &lt;p&gt;Требуется вывести всех активных пользователей (ApplicationUser) в режиме Pageable, которые принадлежат определённым ролям (Authority).&lt;/p&gt;
  &lt;p&gt;Первый вариант:&lt;/p&gt;
  &lt;pre data-lang=&quot;java&quot;&gt;Page&amp;lt;ApplicationUser&amp;gt; findAllByIsActiveIsTrueAndUser_AuthoritiesIsIn(Set&amp;lt;Authority&amp;gt; authorities, Pageable pageable);&lt;/pre&gt;
  &lt;p&gt;Работает, но выводятся дубли (по кол-ву совпавших у пользователя ролей).&lt;/p&gt;
  &lt;p&gt;Второй вариант:&lt;/p&gt;
  &lt;pre data-lang=&quot;java&quot;&gt;@Query(
        value = &amp;quot;select distinct applicationUser from ApplicationUser applicationUser left join fetch applicationUser.user, Authority a &amp;quot; +
                &amp;quot;where a in (:authorities) and a in elements(applicationUser.user.authorities) and applicationUser.isActive = true&amp;quot;,
        countQuery = &amp;quot;select distinct applicationUser from ApplicationUser applicationUser, Authority a &amp;quot; +
                &amp;quot;where a in (:authorities) and a in elements(applicationUser.user.authorities) and applicationUser.isActive = true&amp;quot;
)
Page&amp;lt;ApplicationUser&amp;gt; findAllByIsActiveIsTrueAndUser_AuthoritiesIsIn(Set&amp;lt;Authority&amp;gt; authorities, Pageable pageable);&lt;/pre&gt;
  &lt;p&gt;Всё работает. Для сравнения множеств в раздел from дополнительно указываем Authority, а в where сравниваем authority с искомым списком ролей, а затем с ролями пользователя и делаем distinct.&lt;/p&gt;
  &lt;p&gt;Вариант findDistinctByIsActiveIsTrueAndUser_AuthoritiesIsIn для вложенных запросов не сработал, но должен работать для обычных запросов.&lt;/p&gt;

</content></entry><entry><id>eska2000:mfDlzurQB_T</id><link rel="alternate" type="text/html" href="https://teletype.in/@eska2000/mfDlzurQB_T?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=eska2000"></link><title>Полезные атрибуты Spring Data</title><published>2021-08-15T13:33:56.350Z</published><updated>2021-08-15T13:33:56.350Z</updated><summary type="html">@CreatedDate - атрибут над полем столбца сущности с типом Date (java.util.Date)</summary><content type="html">
  &lt;p&gt;&lt;strong&gt;@CreatedDate&lt;/strong&gt; - атрибут над полем столбца сущности с типом Date (java.util.Date)&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;@LastModifiedDate&lt;/strong&gt; - атрибут над полем столбца сущности с типом Date (java.util.Date)&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;@Enumerated(EnumType.STRING)&lt;/strong&gt; - атрибут над полем столбца сущности с типом Enum&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;@MappedSuperClass&lt;/strong&gt; - атрибут над базовым классом сущности&lt;/p&gt;

</content></entry></feed>