<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های رسول غفاری</title>
        <link>https://virgool.io/feed/@rasoolghafari</link>
        <description>برنامه نویس جاوا</description>
        <language>fa</language>
        <pubDate>2026-06-16 21:21:24</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/24180/avatar/bM5gyU.jpg?height=120&amp;width=120</url>
            <title>رسول غفاری</title>
            <link>https://virgool.io/@rasoolghafari</link>
        </image>

                    <item>
                <title>چگونه در هایبرنت cast رو به پائین انجام دهیم؟!</title>
                <link>https://virgool.io/baharan-co/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AF%D8%B1-%D9%87%D8%A7%DB%8C%D8%A8%D8%B1%D9%86%D8%AA-cast-%D8%B1%D9%88-%D8%A8%D9%87-%D9%BE%D8%A7%D8%A6%DB%8C%D9%86-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D8%AF%D9%87%DB%8C%D9%85-qrdxohr2uify</link>
                <description>فرض کنید که تو دامنه مدل ما رابطه وراثت وجود داره و میخواهیم در یک کوئری هایبرنت کلاس پدر رو به کلاس های فرزند cast کنیم، اما چگونه؟در JPA 2.1 عملگر TREAT معرفی شد تا با استفاده از اون بتونیم عملیات cast رو به پائین رو انجام بدیم!فرض کنید که دامنه مدل های ما مربوط به نویسنده (Author) و انتشارات(Publication) است که انتشارات می تونه انواع مختلفی مثل کتاب(Book) و پست وبلاگ(BlogPost) داشته باشد. همونطور که مشخص هست تو این دامنه مدلها، کلاس انتشارات میتونه کلاس پدر و کتاب و پست و وبلاگ میتونن کلاس فرزند باشند.دامنه مدل های نویسنده و انتشارات حالا میخوام با اجرای یک کوئری و با استفاده از عملگر TREAT نویسندگانی که کتابی دارند که در ISBN آن عبارت 123 وجود دارد را پیدا کنیم.List&lt;Object[]&gt; result = em.createQuery( &quot;SELECT a, p
FROM Author a
JOIN a.publications p
WHERE treat(p AS Book).isbnNumber LIKE &#039;%123%&#039;&quot;).getResultList();البته از عملگر TREAT در قسمت select هم می تونیم استفاده کنیم. مثلا فرض کنید میخوایم محتوای پستهای یک نویسنده رو select کنیم:List&lt;String&gt; result = em.createQuery( &quot;SELECT treat(p AS Publication).postContent
FROM Author a
JOIN a.publications p
WHERE a.id = 1&quot;).getResultList();</description>
                <category>رسول غفاری</category>
                <author>رسول غفاری</author>
                <pubDate>Thu, 27 Dec 2018 10:29:55 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه استفاده از schema و catalog به صورت عمومی در کوئری های SQL و HQL</title>
                <link>https://virgool.io/baharan-co/%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-schema-%D9%88-catalog-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%B9%D9%85%D9%88%D9%85%DB%8C-%D8%AF%D8%B1-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C-%D9%87%D8%A7%DB%8C-sql-%D9%88-hql-aauoqmyhbnxo</link>
                <description>زمانی که ساختار پایگاه داده شما به صورتی است که از چندین شما استفاده می کنید، می توانید با استفاده از hibernate.default_schema در فایل مربوط به تنظیمات Hibernate از یک شمای کلی به عنوان شمای عمومی استفاده کنید:&lt;property name=&quot;hibernate.default_schema&quot; value=&quot;forum&quot;/&gt;هایبرنت با استفاده از کد فوق، در جاهایی که قصد اجرای کوئری HQL را دارید، شما مورد نظر را در تبدیل کوئری از HQL به SQL استفاده می کند. به مثال زیر توجه کنید:@Entity(name = &quot;Event&quot;)
@Table(name = &quot;event&quot;)
public class Event { 
    @Id
    @GeneratedValue
    private long id;

    private String name;
    
    @Column(name = &quot;created_on&quot;)
    private Timestamp createdOn;

    //Getters and setters omitted for brevity
}اگر قصد اجرای یک کوئری به صورت زیر داشته باشیم:List&lt;Event&gt; events = entityManager.createQuery(
    &quot;select e &quot; +
    &quot;from Event e &quot; +
    &quot;where e.createdOn &gt; :timestamp&quot;, Event.class)
    .setParameter(&quot;timestamp&quot;, Timestamp.valueOf(LocalDateTime.now().minusMonths(1)))
   .getResultList();هایبرنت با استفاده از تنظیمات تعریف شده نام شما را در کوئری SQL ای که تولید می کند، قرار می دهد. یعنی کوئری چیزی مشابه زیر می شود:SELECT e.id AS id1_0_,
       e.created_on AS created_2_0_,
       e.name AS name3_0_
FROM   forum.event e
WHERE  e.created_on &gt; &#039;2016-09-26 17:22:11.191&#039;اما اگر درجایی قصد اجرای کوئری به زبان SQL داشته باشیم باید چه کنیم؟ اگر کوئری را به شکل زیر تعریف کنیم:@NamedNativeQuery(
    name = &quot;past_30_days_events&quot;,
    query =
        &quot;select * &quot; +
        &quot;from event&quot; +
        &quot;where age(created_on) &gt; &#039;30 days&#039;&quot;,
    resultClass = Event.class
)و برای اجرای آن به صورت زیر عمل کنیم:List&lt;Event&gt; events = entityManager.createNamedQuery(&quot;past_30_days_events&quot;).getResultList();با خطای زیر مواجه خواهیم شد:javax.persistence.PersistenceException:
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Caused by: org.postgresql.util.PSQLException: ERROR: relation &quot;event&quot; does not existبرای حل این مشکل یک راه حل وجود دارد، اینکه هرجا که قصد اجرای کوئری های SQL را داریم، مستقیما به شما مورد نظر اشاره کنیم. یک راه حل هم این هست که این کار به هایبرنت بسپاریم. برای این کار کافی است به شکل زیر عمل کنیم:@NamedNativeQuery(
    name = &quot;past_30_days_events&quot;,
    query =
        &quot;select * &quot; +
        &quot;from {h-schema}event &quot; +
        &quot;where age(created_on) &gt; &#039;30 days&#039;&quot;,
        resultClass = Event.class
)با اینکار هایبرنت هنگام تولید کوئری SQL نام شما را به صورت اتوماتیک تولید می کند:SELECT * FROM
forum.event
WHERE  age(created_on) &gt; &#039;30 days&#039;بسیار عالی!!!نتیجه گیریاستفاده از شمای پیش فرض کار بسیار راحت می کند و تنها کافی این شما را در &#x60;hibernate.default_schema&#x60; مشخص کنیم. با اینکار کوئری های HQL به راحتی با شمای پیش فرض اجرا می شوند و برای کوئری های SQL نیز بایستی از ‍&#x60;{h-schema}&#x60; استفاده کنیم.</description>
                <category>رسول غفاری</category>
                <author>رسول غفاری</author>
                <pubDate>Wed, 19 Dec 2018 21:01:39 +0330</pubDate>
            </item>
            </channel>
</rss>